eval_tidy() 适用于普通函数,但不适用于 tidyverse 函数

问题描述 投票:0回答:1

我正在尝试编写一个有条件地在 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 dplyr tidyverse tidyr rlang
1个回答
0
投票

为此使用 R 的标准

if/else
控制流程可能是最简单的。将
if/else
包装到函数中会带来复杂性,可能不值得节省几个字符。 (不过,我很好奇是否有一个好的方法可以做到这一点——即将管道的步骤作为函数参数传递。)

例如,我们可以使用

library(dplyr)
mtcars %>% 
  {if(T) summarize(., C = mean(mpg), .by = gear) else .}

这将有条件地总结

mtcars
或将其输出不变,具体取决于初始测试。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.