我正在尝试编写一个有条件地在 dplyr-pipeline 中应用子管道的函数,但我一直坚持将子管道应用于数据。
我尝试了各种使用定语和表达式的解离,但当我想应用整个子管道时,我无法完全理解合适的方法是什么。
我所做的就是这个,但它只适用于普通函数,不适用于 tidyverse 函数。
ifff <- function(.data, IF, then) {
# Defuse function as naked function
thn <- rlang::enexpr(then)
# Conditionally apply the expression
if (IF) {
return(rlang::eval_tidy(thn, .data))
} else {
return(.data)
}
}
df <- data.frame(A = 1:3,B = 2:4)
df %>% ifff(T,mean(A)) # works
df %>% ifff(T,group_by(A)) # doesn't
总的来说,我希望像
df %>% ifff(T, group_by(A) %>% summarise(C = mean(B)))
这样的东西也能工作,但当我得到一个 tidyverse 函数来评估时,我已经很高兴了。
为此使用 R 的标准
if/else
控制流程可能是最简单的。将 if/else
包装到函数中会带来复杂性,可能不值得节省几个字符。 (不过,我很好奇是否有一个好的方法可以做到这一点——即将管道的步骤作为函数参数传递。)
例如,我们可以使用
library(dplyr)
mtcars %>%
{if(T) summarize(., C = mean(mpg), .by = gear) else .}
这将有条件地总结
mtcars
或将其输出不变,具体取决于初始测试。