Я пытаюсь использовать аккуратную оценку, как определено в dplyr 0.7.0
.
Однако во время вызова функции в mutate()
я получаю сообщение об ошибке. Похоже, что переменные не оцениваются, как я ожидал.
library(dplyr)
library(tibble)
library(tidyr)
myCor <- function(col1, col2) {
col1 <- enquo(col1)
col2 <- enquo(col2)
mtcars %>%
rownames_to_column("vehicle") %>%
select(vehicle, !!col1, !!col2) %>%
mutate(correlation=cor(!!col1, !!col2))
}
myCor("mpg", "disp")
# Error in mutate_impl(.data, dots) :
# Evaluation error: 'x' must be numeric.
Вместо этого я должен использовать этот неаккуратный синтаксис eval, чтобы получить желаемый результат.
myCor <- function(col1, col2) {
col1_tidy <- enquo(col1)
col2_tidy <- enquo(col2)
mtcars %>%
rownames_to_column("vehicle") %>%
select(vehicle, !!col1_tidy, !!col2_tidy) %>%
mutate(correlation=cor(eval(parse(text=col1)), eval(parse(text=col2))))
}
myCor("mpg", "disp")
# vehicle mpg disp correlation
# 1 Mazda RX4 21.0 160.0 -0.8475514
# 2 Mazda RX4 Wag 21.0 160.0 -0.8475514
# 3 Datsun 710 22.8 108.0 -0.8475514
# 4 Hornet 4 Drive 21.4 258.0 -0.8475514
# ...
Есть ли способ использовать аккуратную оценку в этом примере?
myCor(mpg, disp)
(кавычки не нужны, это самое интересное с nse :)) - person kath   schedule 11.05.2018myCor(mpg, disp)
сmyCor("mpg", "disp")
Цитаты имеют большое значение. С ними у вас есть значение символа, без них у вас есть символы. NSE обычно предполагает, что у вас есть символы. - person MrFlick   schedule 11.05.2018as.name()
илиrlang::sym()
, а неparse(text=))
- person MrFlick   schedule 11.05.2018cor()
. Но если вы опустите строкуmutate()
, вызовselect()
будет вести себя идентично со строками или выражениями NSE. Почему это? - person Megatron   schedule 11.05.2018select
может обрабатывать строки как входные данные,mutate
не может - он ожидает измененных имен столбцов.select
там более гибкий - person kath   schedule 11.05.2018rlang::sym()
может обрабатывать как строки, так и пустые имена столбцов, что является приятным бонусом по сравнению сquo
иenquo
. Похоже, чтоselect
используетsym
или его форму множественного числаsyms
, аmutate
используетenquo
. - person Nate   schedule 11.05.2018