การประเมินแบบเป็นระเบียบ: {{ }} และ .data
เขียนฟังก์ชัน dplyr ที่รับชื่อคอลัมน์เป็นอาร์กิวเมนต์ได้อย่างปลอดภัย
การประเมินแบบเป็นระเบียบ: {{ }} และ .data เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
ปัญหา: การเขียนโปรแกรมด้วย dplyr
dplyr ใช้การประเมินนิพจน์แบบไม่มาตรฐาน (NSE) โดยส่งชื่อคอลัมน์โดยไม่ใส่เครื่องหมายคำพูด วิธีนี้สะดวกเมื่อใช้งานแบบโต้ตอบ แต่ทำได้ซับซ้อนขึ้นเมื่อเขียนฟังก์ชัน แล้วจะส่งชื่อคอลัมน์ในรูปตัวแปรให้ฟังก์ชัน dplyr ได้อย่างไร
library(dplyr)
df <- data.frame(x=1:5, y=c(2,4,6,8,10))
# Works fine interactively:
df %>% summarize(mean_x = mean(x))
# But what if 'x' is a variable?
col_name <- 'x'
# df %>% summarize(result = mean(col_name)) # WRONG! treats 'col_name' as column
cat('Need tidy evaluation to solve this!')ตัวดำเนินการ {{ }} สำหรับโอบรับชื่อคอลัมน์
ภายในฟังก์ชัน ให้ใช้ {{ col_var }} (เรียกว่า 'curly-curly' หรือ 'embrace') เพื่อส่งชื่อคอลัมน์ที่จะถูกประเมินภายในบริบทของกรอบข้อมูล วิธีนี้เป็นแนวทางที่แนะนำสำหรับการเขียนฟังก์ชัน dplyr โดยทั่วไป
library(dplyr)
df <- data.frame(
group = c('A','A','B','B'),
sales = c(100, 120, 200, 180),
costs = c(60, 70, 110, 90)
)
# Function using {{ }}
group_mean <- function(data, group_col, value_col) {
data %>%
group_by({{ group_col }}) %>%
summarize(mean_val = mean({{ value_col }}), .groups = 'drop')
}
group_mean(df, group, sales)
group_mean(df, group, costs){{ }} สำหรับชื่อคอลัมน์ในผลลัพธ์
คุณสามารถใช้ {{ }} ทางด้านซ้ายของ := เพื่อกำหนดชื่อคอลัมน์ผลลัพธ์แบบไดนามิกได้ด้วย ตัวดำเนินการ := (ตัวดำเนินการวอลรัส) อนุญาตให้ใช้ชื่อตัวแปรทางด้านซ้ายของการกำหนดค่าภายในคำกริยา dplyr
library(dplyr)
df <- data.frame(a=1:4, b=c(2,4,6,8))
# Dynamic output column name
compute_mean <- function(data, col) {
col_name <- paste0('mean_', deparse(substitute(col)))
data %>% summarize('{col_name}' := mean({{ col }}))
}
compute_mean(df, a)
compute_mean(df, b)คำสรรพนาม .data
.data[['col_name']] ช่วยให้คุณเลือกคอลัมน์โดยใช้ตัวแปรสตริง เป็นการระบุอย่างชัดเจนให้ dplyr ค้นหาคอลัมน์ในกรอบข้อมูลปัจจุบัน เหมาะเมื่อคุณมีชื่อคอลัมน์อยู่ในรูปสตริงอักขระ
library(dplyr)
df <- data.frame(
name = c('Alice','Bob','Carol'),
score = c(85, 92, 78),
grade = c('B','A','C')
)
# Using .data with a string variable
get_summary <- function(data, col_name) {
data %>%
summarize(
n = n(),
mean_val = mean(.data[[col_name]])
)
}
get_summary(df, 'score')across() — ใช้กับหลายคอลัมน์
across(cols, fns) ภายใน mutate() หรือ summarize() จะใช้ฟังก์ชันกับหลายคอลัมน์พร้อมกัน เลือกคอลัมน์ด้วยตัวช่วย tidyselect เช่น starts_with(), where(is.numeric), everything() เป็นต้น
library(dplyr)
df <- data.frame(
id = 1:3,
sales_q1 = c(100, 200, 150),
sales_q2 = c(120, 180, 160),
cost_q1 = c(60, 110, 80),
cost_q2 = c(70, 100, 85)
)
# Summarize all numeric columns except 'id'
df %>%
summarize(across(where(is.numeric) & !id, mean))across() พร้อมฟังก์ชันที่มีชื่อ
ส่งรายการฟังก์ชันที่มีชื่อให้กับ across() เพื่อคำนวณสถิติหลายรายการต่อคอลัมน์ คอลัมน์ผลลัพธ์จะมีชื่อในรูปแบบ col_fn ใช้ .names เพื่อปรับแต่งรูปแบบการตั้งชื่อ
library(dplyr)
df <- data.frame(
x = c(10, 20, 30, 40),
y = c(5, 15, 25, 35)
)
# Compute mean and sd for both columns
df %>%
summarize(across(
c(x, y),
list(mean = mean, sd = sd),
.names = '{.col}_{.fn}'
))across() ใน mutate()
การใช้ across() ภายใน mutate() จะเปลี่ยนแปลงหลายคอลัมน์พร้อมกัน ช่วยหลีกเลี่ยงการเขียนการแปลงแบบเดียวกันซ้ำสำหรับแต่ละคอลัมน์
library(dplyr)
df <- data.frame(
id = 1:3,
revenue = c(1000, 2000, 1500),
cost = c(600, 1100, 800),
tax = c(100, 200, 150)
)
# Round all numeric columns except id to nearest 10
df %>%
mutate(across(where(is.numeric) & !id,
~round(., -2)))pick() — เลือกคอลัมน์สำหรับการดำเนินการ
pick() (dplyr 1.1 ขึ้นไป) เลือกบางส่วนของคอลัมน์เป็นกรอบข้อมูลขนาดเล็ก เหมาะสำหรับส่งให้ฟังก์ชันที่ต้องการกรอบข้อมูล ใช้งานได้ภายใน mutate() และ summarize()
library(dplyr)
df <- data.frame(
id = 1:3,
a = c(1, 2, 3),
b = c(4, 5, 6),
c_val = c(7, 8, 9)
)
# Use pick() to compute row-wise mean across selected columns
df %>%
mutate(
row_mean = rowMeans(pick(a, b, c_val)),
row_max = do.call(pmax, pick(a, b, c_val))
)การเขียนฟังก์ชัน dplyr ที่นำกลับมาใช้ซ้ำได้
การใช้ {{ }}, .data[[]] และ across() ร่วมกันช่วยให้คุณเขียนฟังก์ชันวิเคราะห์ที่ทรงพลังและนำกลับมาใช้ซ้ำได้ รูปแบบสำคัญคือ รับชื่อคอลัมน์เป็นอาร์กิวเมนต์ที่ไม่ใส่เครื่องหมายคำพูด (ใช้ {{ }}) หรือเป็นสตริง (ใช้ .data[[]])
library(dplyr)
df <- data.frame(
region = c('East','East','West','West'),
product = c('A','B','A','B'),
revenue = c(100, 200, 150, 250),
units = c(10, 15, 12, 20)
)
# Flexible grouped summary function
group_stats <- function(data, ..., metric) {
data %>%
group_by(...) %>%
summarize(
total = sum({{ metric }}),
average = mean({{ metric }}),
.groups = 'drop'
)
}
group_stats(df, region, metric = revenue)
group_stats(df, region, product, metric = units)ตัวช่วยการเลือกแบบ Tidy
ตัวช่วย tidyselect ใช้งานภายใน across(), select() และ pick() ได้แก่ starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate) และ everything()
library(dplyr)
df <- data.frame(
id = 1:3,
score_2022 = c(80,85,90),
score_2023 = c(82,88,91),
score_2024 = c(85,90,93),
category = c('A','B','A')
)
# Select all score columns and compute their means
df %>%
summarize(
across(starts_with('score'), mean),
n = n()
)การผสานรูปแบบ Tidy Eval
ฟังก์ชัน dplyr ในการใช้งานจริงมักใช้ {{ }} สำหรับตัวแปรจัดกลุ่ม ใช้ across() สำหรับตัวชี้วัดหลายรายการ และใช้ .data[[]] สำหรับชื่อคอลัมน์แบบสตริง การเข้าใจว่าเมื่อใดควรใช้แต่ละรูปแบบจะทำให้โค้ดของคุณยืดหยุ่นและถูกต้อง
library(dplyr)
df <- data.frame(
dept = c('HR','HR','Eng','Eng'),
salary = c(60000, 65000, 100000, 110000),
bonus = c(5000, 6000, 15000, 18000)
)
# String-based column selection with .data
summarize_column <- function(data, group_col, value_col_name) {
data %>%
group_by(.data[[group_col]]) %>%
summarize(
mean = mean(.data[[value_col_name]]),
total = sum(.data[[value_col_name]]),
.groups = 'drop'
)
}
summarize_column(df, 'dept', 'salary')
summarize_column(df, 'dept', 'bonus')ตรวจสอบความเข้าใจ
ภายในฟังก์ชันที่กำหนดเอง วิธีที่ถูกต้องในการส่งชื่อคอลัมน์เป็นอาร์กิวเมนต์ที่ไม่ใส่เครื่องหมายคำพูดให้กับ dplyr คืออะไร
สรุป: การประเมินแบบ Tidy
ประเด็นสำคัญของการเขียนโปรแกรมด้วย dplyr:
{{ col }}— โอบรับอาร์กิวเมนต์ชื่อคอลัมน์ที่ไม่ใส่เครื่องหมายคำพูดในฟังก์ชัน.data[['col_name']]— เข้าถึงคอลัมน์ด้วยชื่อตัวแปรสตริง:=ตัวดำเนินการวอลรัส — ใช้ร่วมกับ{{ }}หรือสตริง glue เพื่อกำหนดชื่อผลลัพธ์แบบไดนามิกacross(cols, fns)— ใช้ฟังก์ชันกับหลายคอลัมน์พร้อมกันpick(cols)— เลือกคอลัมน์เป็นกรอบข้อมูลย่อยสำหรับการดำเนินการแบบรายแถว- ตัวช่วย tidyselect:
starts_with(),where(),contains(),everything()
library(dplyr)
df <- data.frame(
group = c('A','A','B','B'),
v1 = c(10, 20, 30, 40),
v2 = c(5, 15, 25, 35)
)
# Reusable function using {{ }} + across
group_summary <- function(data, grp) {
data %>%
group_by({{ grp }}) %>%
summarize(across(where(is.numeric), list(mean=mean, sum=sum)), .groups='drop')
}
group_summary(df, group)เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “การประเมินแบบเป็นระเบียบ: {{ }} และ .data” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การประเมินแบบเป็นระเบียบ: {{ }} และ .data” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การประเมินแบบเป็นระเบียบ: {{ }} และ .data”
เขียนฟังก์ชัน dplyr ที่รับชื่อคอลัมน์เป็นอาร์กิวเมนต์ได้อย่างปลอดภัย คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การประเมินแบบเป็นระเบียบ: {{ }} และ .data” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- สรุปข้อมูลแบบจัดกลุ่มและ group_by()
- ฟังก์ชันหน้าต่าง: lag, lead, cumsum
- การเชื่อมหลายตารางใน dplyr
- การประเมินแบบเป็นระเบียบ: {{ }} และ .data