r - 在 tidyeval 函数中制作循环友好的公式界面

标签 r tidyeval

我正在使用 tidyeval 编写一个简单的函数,我需要将参数传递给公式接口(interface)。虽然我已经设法构建了该函数的工作版本,但它似乎不适用于 for 循环。

函数

foo <- function(data, x, y) {
  BayesFactor::ttestBF(
    paired = FALSE,
    data = data,
    formula = rlang::new_formula(rlang::enexpr(y), rlang::enexpr(x))
  )
}

foo(mtcars, am, wt)
#> Bayes factor analysis
#> --------------
#> [1] Alt., r=0.707 : 1383.367 ±0%
#> 
#> Against denominator:
#>   Null, mu1-mu2 = 0 
#> ---
#> Bayes factor type: BFindepSample, JZS

使用循环

我也试过这里 !!col.name[i]

df <- dplyr::select(mtcars, am, wt, mpg)
col.name <- colnames(df)

for (i in 2:length(col.name)) {
  foo(
    data = mtcars,
    x = am,
    y = col.name[i]
  )
}
#> Error in `[.data.frame`(data, , dv): undefined columns selected

最佳答案

如果你想让数据屏蔽函数在列上循环工作,你必须在某些时候进行元编程。

实际上有两种选择:

  • 要么让您的函数接受具有标准评估的字符串。然后在内部将该字符串转换为符号。元编程是内部的。

  • 或者让它接受具有非标准评估的表达式。然后你的调用者必须将字符串转换为符号并取消引用它们。元编程是外部的。

没有办法解决这个问题,除非您要创建一个非标准界面,该界面会因过于神奇而变得不一致且不可预测。

关于r - 在 tidyeval 函数中制作循环友好的公式界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65002089/

相关文章:

r - 如果前一行包含以特定符号开头的字符串,则合并行

regex - R:仅当特殊正则表达式条件不匹配时才拆分

r - 为什么 cSplit 返回 TRUE 而不是字符

r - Tidyeval:如何在没有用户引用的情况下将带有引用元素的列表传递给嵌套函数?

r - 在 rlang 表达式的准引用中使用预先存在的字符向量

r - 为 gganimate 绘图添加渐变和手绘效果

r - 你如何处理中间有印地语单词的英文文本? (R 中的文本挖掘)

r - 在函数 dplyr 中将变量名转换为字符串

R如何将一个函数作为字符串传递给另一个函数

r - 将变量传递给 tidyr::pivot_wider 的 names_glue 参数