R Academy · บทเรียน

การประเมินแบบเป็นระเบียบ: {{ }} และ .data

เขียนฟังก์ชัน dplyr ที่รับชื่อคอลัมน์เป็นอาร์กิวเมนต์ได้อย่างปลอดภัย

บทเรียน 4 จาก 413 ขั้นตอน

การประเมินแบบเป็นระเบียบ: {{ }} และ .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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. สรุปข้อมูลแบบจัดกลุ่มและ group_by()
  2. ฟังก์ชันหน้าต่าง: lag, lead, cumsum
  3. การเชื่อมหลายตารางใน dplyr
  4. การประเมินแบบเป็นระเบียบ: {{ }} และ .data
← กลับไปที่ R Academy