假设我有这个数据:
d <- msleep %>%
mutate(comfort_color_desk = sample(c(0,1), replace=TRUE, size=nrow(msleep)),
comfort_color_chair = sample(c(0,1), replace=TRUE, size=nrow(msleep)))
我想把它传递给一个dplyr
链,它位于我创建的一个函数中,该函数还包含一个指示符,用于触发链中的{if}
子句。
例如(这很好):
test_fcn <- function(.x, .y, .count = NULL) {
.x %>% select(order, .y) %>%
{if(isTRUE(.count)) count(.,!!ensym(.y)) else .}
}
d %>% test_fcn(., .y = "comfort_color_desk", .count = TRUE)
这显示了我想做的事情的基本原理。我面临的问题是,当我想只传递列名和paste
的一部分时,它带有一个字符串,并将其作为函数内的数据列进行计算。
例如(这不起作用):
test_2_fcn <- function(.x, .y, .z, .compare = NULL) {
.x %>%
{if(isTRUE(.compare)) filter(., paste0("comfort_color_", !!ensym(.y)) == 1 & paste0("comfort_color", !!ensym(.z)) == 1) else .}
}
d %>% test_2_fcn(., .y = "desk", .z = "chair", .compare = TRUE)
我怀疑这是一个整洁评估的问题。有人能在这里指出正确的方向吗?
1条答案
按热度按时间i1icjdpr1#
paste0
函数在!!ensym()
被计算之前被计算,现在它试图用符号.y
或.z
而不是值粘贴文字字符串"comfort_color_"
。我们可以使用
sym()
函数将字符串转换为符号,然后使用paste()
将字符串连接在一起。