将值传递到函数中if{}语句中的管道dplyr动词

jaxagkaj  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(85)

假设我有这个数据:

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)

我怀疑这是一个整洁评估的问题。有人能在这里指出正确的方向吗?

i1icjdpr

i1icjdpr1#

paste0函数在!!ensym()被计算之前被计算,现在它试图用符号.y.z而不是值粘贴文字字符串"comfort_color_"
我们可以使用sym()函数将字符串转换为符号,然后使用paste()将字符串连接在一起。

library(dplyr)

test_2_fcn <- function(.x, .y, .z, .compare = NULL) {
  .x %>% 
    {if(isTRUE(.compare)) filter(., !!sym(paste0("comfort_color_", .y)) == 1 & !!sym(paste0("comfort_color_", .z)) == 1) else .} 
}

d %>% test_2_fcn(., .y = "desk", .z = "chair", .compare = TRUE)

相关问题