Внутри некоторых функций как dplyr::mutate_at
или purrr::map
кажется может использовать оператор тильды ~
для создания анонимных функций.
Например, можно сделать как в связанном вопросе: map(iris, ~length(unique(.)))
Или еще: mtcars %>% mutate_all(~.*2)
Я пытался имитировать это внутри sapply
, чтобы избежать sapply(list, function(item) {something_with_item})
. Я писал sapply(list, ~ something_with_.)
, но получаю ошибку
Error in match.fun(FUN) :
'~ something_with_.' is not a function, character or symbol
Воспроизводимый пример:
> sapply(names(mtcars),function(item) mean(mtcars[[item]]))
mpg cyl disp hp drat wt qsec
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750
vs am gear carb
0.437500 0.406250 3.687500 2.812500
> sapply(names(mtcars),~mean(mtcars[[.]]))
Error in match.fun(FUN) :
'~mean(mtcars[[.]])' is not a function, character or symbol
Почему? Понимание этого синтаксиса как функции — это просто поведение некоторых пакетов, таких как dplyr
и purrr
? Понимается ли это по базе R
для каких-то особых случаев?
Благодарю вас!
formula
, которыйtidyverse
обычно принимается для нестандартной оценки, в то время как базовое семейство приложений не принимает, поэтому все равно ожидайте, что будет предоставленfunction
. См. эту виньетку для получения более подробной информации о его реализации в кранеtidyverse
: .r-project.org/web/packages/lazyeval/vignettes/ - person caldwellst   schedule 14.10.2019