Penilaian Kemas: {{ }} dan .data
Tulis fungsi dplyr yang menerima nama lajur sebagai argumen dengan selamat.
Penilaian Kemas: {{ }} dan .data ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Masalahnya: Pengaturcaraan dengan dplyr
dplyr menggunakan penilaian bukan standard (NSE) — nama lajur dihantar tanpa tanda petik. Ini mudah ketika berinteraksi, tetapi lebih rumit apabila Anda menulis fungsi. Bagaimanakah Anda menghantar nama lajur sebagai pemboleh ubah kepada fungsi 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!')Operator {{ }} Embrace
Di dalam fungsi, gunakan {{ col_var }} (dipanggil 'curly-curly' atau 'embrace') untuk menghantar nama lajur yang akan dinilai dalam konteks bingkai data. Ini ialah pendekatan yang disyorkan untuk kebanyakan pengaturcaraan fungsi 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){{ }} untuk Nama Lajur dalam Output
Anda juga boleh menggunakan {{ }} di sebelah kiri := untuk menamakan lajur output secara dinamik. Operator := (operator walrus) membenarkan nama pemboleh ubah di sebelah kiri tugasan dalam kata kerja 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)Kata Ganti .data
.data[['col_name']] membolehkan Anda memilih lajur menggunakan pemboleh ubah rentetan. Ini memberitahu dplyr secara jelas supaya mencari lajur dalam bingkai data semasa. Ia berguna apabila Anda mempunyai nama lajur sebagai rentetan aksara.
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() — Gunakan pada Berbilang Lajur
across(cols, fns) di dalam mutate() atau summarize() menggunakan fungsi pada berbilang lajur serentak. Pilih lajur dengan pembantu tidyselect: starts_with(), where(is.numeric), everything() dan sebagainya.
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() dengan Fungsi Bernama
Hantar senarai fungsi bernama kepada across() untuk mengira berbilang statistik bagi setiap lajur. Lajur output dinamakan sebagai col_fn. Gunakan .names untuk menyesuaikan corak penamaan.
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() dalam mutate()
Menggunakan across() di dalam mutate() mengubah berbilang lajur secara serentak. Ini mengelakkan pengulangan transformasi yang sama bagi setiap lajur secara berasingan.
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() — Pilih Lajur untuk Operasi
pick() (dplyr 1.1+) memilih subset lajur sebagai bingkai data kecil, yang berguna untuk dihantar kepada fungsi yang menjangkakan bingkai data. Ia berfungsi di dalam mutate() dan 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))
)Menulis Fungsi dplyr yang Boleh Digunakan Semula
Menggabungkan {{ }}, .data[[]] dan across() membolehkan Anda menulis fungsi analisis yang berkuasa dan boleh digunakan semula. Corak utama: terima nama lajur sebagai argumen tanpa tanda petik (gunakan {{ }}) atau sebagai rentetan (gunakan .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)Pembantu Pemilihan Tidy
Pembantu tidyselect berfungsi di dalam across(), select() dan pick(): starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate) dan 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()
)Menggabungkan Corak Penilaian Tidy
Fungsi dplyr dunia sebenar sering menggabungkan {{ }} untuk pemboleh ubah kumpulan, across() untuk berbilang metrik dan .data[[]] untuk nama lajur rentetan. Memahami masa untuk menggunakan setiap corak menjadikan kod Anda fleksibel dan betul.
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')Semakan Pantas
Di dalam fungsi tersuai, apakah cara yang betul untuk menghantar nama lajur sebagai argumen tanpa tanda petik kepada dplyr?
Imbas Kembali: Penilaian Tidy
Perkara penting tentang pengaturcaraan dengan dplyr:
{{ col }}— masukkan argumen nama lajur tanpa tanda petik ke dalam fungsi.data[['col_name']]— akses lajur berdasarkan nama pemboleh ubah rentetan- operator walrus
:=— gunakan dengan{{ }}atau rentetan gam untuk nama output dinamik across(cols, fns)— gunakan fungsi pada berbilang lajur serentakpick(cols)— pilih lajur sebagai subbingkai data untuk operasi mengikut baris- Pembantu 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)Pelajari R dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Penilaian Kemas: {{ }} dan .data” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “Penilaian Kemas: {{ }} dan .data”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penilaian Kemas: {{ }} dan .data”?
Tulis fungsi dplyr yang menerima nama lajur sebagai argumen dengan selamat. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan R Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Penilaian Kemas: {{ }} dan .data” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Ringkasan Berkumpulan dan group_by()
- Fungsi Tetingkap: lag, lead, cumsum
- Cantuman Berbilang Jadual dalam dplyr
- Penilaian Kemas: {{ }} dan .data