R Academy · Lekcja

Ewaluacja tidy: {{ }} i .data

Pisz funkcje dplyr, które bezpiecznie przyjmują nazwy kolumn jako argumenty.

Lekcja 4 z 413 kroki

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 wynikowym
  • across(cols, fns) — stosowanie funkcji lub funkcji do wielu kolumn jednocześnie
  • pick(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)
Bezpłatny start

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

  1. Podsumowania grupowane i group_by()
  2. Funkcje okna: lag, lead, cumsum
  3. Łączenie wielu tabel w dplyr
  4. Ewaluacja tidy: {{ }} i .data
← Powrót do R Academy