Ewaluacja tidy: {{ }} i .data
Pisz funkcje dplyr, które bezpiecznie przyjmują nazwy kolumn jako argumenty.
Ewaluacja tidy: {{ }} i .data to bezpłatna lekcja R Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej R Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs R Academy zawiera 4 lekcji w sumie.
Problem: programowanie z użyciem dplyr
dplyr używa niestandardowej ewaluacji (NSE) — nazwy kolumn są przekazywane bez cudzysłowów. Jest to wygodne podczas pracy interaktywnej, ale może sprawiać trudności przy pisaniu funkcji. Jak przekazać nazwę kolumny jako zmienną do funkcji 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 ujmowania {{ }}
Wewnątrz funkcji użyj {{ col_var }} (nazywanego operatorem „curly-curly” lub „embrace”), aby przekazać nazwę kolumny, która zostanie zinterpretowana w kontekście ramki danych. Jest to zalecane podejście w większości przypadków programowania funkcji 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){{ }} dla nazw kolumn w wyniku
Możesz również użyć {{ }} po lewej stronie operatora :=, aby dynamicznie nadawać nazwy kolumnom wynikowym. Operator := (operator walrus) pozwala używać nazw zmiennych po lewej stronie przypisań wewnątrz czasowników 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)Symbol zastępczy .data
.data[['col_name']] pozwala wybrać kolumnę za pomocą zmiennej tekstowej. Jawnie wskazuje dplyr, aby wyszukał kolumnę w bieżącej ramce danych. Jest to przydatne, gdy nazwy kolumn są ciągami znaków.
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() — stosowanie do wielu kolumn
across(cols, fns) wewnątrz mutate() lub summarize() stosuje funkcję jednocześnie do wielu kolumn. Kolumny wybiera się za pomocą pomocników tidyselect: starts_with(), where(is.numeric), everything() itd.
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() z nazwanymi funkcjami
Przekaż do across() nazwaną listę funkcji, aby obliczyć wiele statystyk dla każdej kolumny. Nazwy kolumn wynikowych mają postać col_fn. Użyj .names, aby dostosować wzorzec nazewnictwa.
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() w mutate()
Użycie across() wewnątrz mutate() przekształca wiele kolumn jednocześnie. Pozwala to uniknąć powtarzania tej samej transformacji osobno dla każdej kolumny.
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() — wybieranie kolumn do operacji
pick() (dplyr 1.1+) wybiera podzbiór kolumn jako miniaturową ramkę danych, co jest przydatne przy przekazywaniu ich do funkcji oczekujących ramki danych. Funkcja działa wewnątrz mutate() i 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))
)Pisanie wielokrotnego użytku funkcji dplyr
Połączenie {{ }}, .data[[]] i across() pozwala pisać zaawansowane, wielokrotnego użytku funkcje analityczne. Kluczowy wzorzec: przyjmuj nazwy kolumn jako argumenty bez cudzysłowów (używając {{ }}) albo jako ciągi znaków (używając .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)Pomocnicy tidy selection
Pomocnicy tidyselect działają wewnątrz across(), select() i pick(): starts_with(), ends_with(), contains(), matches(), num_range(), where(predicate) i 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()
)Łączenie wzorców tidy eval
Funkcje dplyr stosowane w rzeczywistych projektach często łączą {{ }} dla zmiennych grupujących, across() dla wielu miar oraz .data[[]] dla nazw kolumn zapisanych jako ciągi znaków. Zrozumienie, kiedy używać każdego wzorca, sprawia, że kod jest elastyczny i poprawny.
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')Szybkie sprawdzenie
Jaki jest prawidłowy sposób przekazania nazwy kolumny jako argumentu bez cudzysłowów do dplyr wewnątrz własnej funkcji?
Podsumowanie: tidy evaluation
Najważniejsze informacje o programowaniu z użyciem dplyr:
{{ col }}— ujmowanie argumentów zawierających nazwy kolumn bez cudzysłowów w funkcjach.data[['col_name']]— dostęp do kolumn za pomocą zmiennej tekstowej zawierającej nazwę:=operator walrus — używaj go z{{ }}lub ciągami glue do dynamicznego nadawania nazw kolumnom wynikowymacross(cols, fns)— stosowanie funkcji lub funkcji do wielu kolumn jednocześniepick(cols)— wybieranie kolumn jako podramki danych do operacji wierszowych- Pomocnicy 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)Ucz się R dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 43
- Lekcje
- 159
Często zadawane pytania
Czy lekcja „Ewaluacja tidy: {{ }} i .data” jest bezpłatna?
Tak — pełny tekst „Ewaluacja tidy: {{ }} i .data” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu R Academy, przejdź na CoddyKit PRO. Kurs R Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Ewaluacja tidy: {{ }} i .data”?
Pisz funkcje dplyr, które bezpiecznie przyjmują nazwy kolumn jako argumenty. Ćwiczysz R Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć R Academy?
Nie wymagamy żadnego doświadczenia. R Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Ewaluacja tidy: {{ }} i .data”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji R Academy?
Tak. Każda lekcja R Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podsumowania grupowane i group_by()
- Funkcje okna: lag, lead, cumsum
- Łączenie wielu tabel w dplyr
- Ewaluacja tidy: {{ }} i .data