Недавно я заметил, что rlang::sym
, похоже, не работает в анонимных функциях, и я не понимаю почему. Вот пример, он довольно неуклюжий и некрасивый, но я думаю, что он иллюстрирует суть
require(tidyverse)
data <- tibble(x1 = letters[1:3],
x2 = letters[4:6],
val = 1:3)
get_it <- function(a, b){
data %>%
mutate(y1 = !!rlang::sym(a)) %>%
mutate(y2 = !!rlang::sym(b)) %>%
select(y1, y2, val)
}
get_it("x1", "x2")
Это определяет некоторые игрушечные данные и (ужасную) функцию, которая по существу переименовывает столбцы на основе имен столбцов. Теперь я могу сделать то же самое для разных комбинаций a и b:
d <- tibble(x = c("x1", "x2"),
y = c("x2", "x1"))
d %>% mutate(tmp = map2(x, y, get_it))
Однако, если я попытаюсь сделать то же самое с анонимной функцией, это не сработает:
d %>% mutate(tmp = map2(x, y, function(a, b){
data %>%
mutate(y1 = !!rlang::sym(a)) %>%
mutate(y2 = !!rlang::sym(b)) %>%
select(y1, y2, val)
}))
Это не удается с object 'a' not found
, хотя функции точно такие же, только здесь это анонимно. Кто-нибудь может объяснить почему?
function(a, b) data %>% mutate(y1 = .[[a]], y2 = .[[b]]) %>% select(y1, y2, val)
так что кажется, что анонимные функции работают, но не rlang в них. - person G. Grothendieck   schedule 18.08.2018UQ()
иUQS()
, которые слишком похожи на вызовы функций, несмотря на очень разную семантику. - person Lionel Henry   schedule 18.08.2018