КРАТКОЕ СОДЕРЖАНИЕ
dplyr unquoting не работает как аргумент функции summarise
, где цитируемый объект является аргументом функции, использующей summarise
, и этот аргумент назначается в цикле for.
For Loop
for(j in 1:1){
sumvar <- paste0("randnum",j)
chkfunc(sumvar)
}
Функция (здесь сокращенно, полностью показано ниже)
chkfunc <- function(sumvar) {
sumvar <- enquo(sumvar)
[...]
summarise(mn = mean(!!sumvar))
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
У меня есть два столбца, которые иногда содержат НП, и я хочу использовать dplyr нестандартное вычисление и его знаменитое исключение кавычек (AKA bang bang !!
) для объединения каждого столбца в один цикл for.
library(dplyr)
set.seed(3)
randnum1 <- rnorm(10)
randnum1[randnum1<0] <- NA
randnum2 <- rnorm(10)
randnum2[randnum2<0] <- NA
randfrm <- data.frame(cbind(randnum1, randnum2))
print(randfrm)
Ниже мы видим, что функция фильтра прекрасно обрабатывает отмену кавычек (!!), но функция суммирования дает сбой, возвращая ошибку «аргумент не является числовым или логическим». То же самое происходит, когда я использую :=
в вызове функции суммирования (здесь не показан), который появился в "Программирование с dplyr" виньетка. Наконец, я подтвердил, что класс для !!sumvar
является числовым внутри функции chkfunc
.
chkfunc <- function(sumvar) {
sumvar <- enquo(sumvar)
message("filter function worked with !!sumvar")
outfrm <- randfrm %>%
filter(!is.na(!!sumvar))
print(outfrm)
message("summarise function failed with !!sumvar")
outfrm <- randfrm %>%
filter(!is.na(!!sumvar)) %>%
summarise(mn = mean(!!sumvar))
}
# Just one iteration to avoid confusion
for(j in 1:1){
sumvar <- paste0("randnum",j)
chkfunc(sumvar)
}