使用 rlang 将公式中的变量名称传递给 tidy 函数

Passing variable names from formula into tidy function with rlang

我已经通读了整洁的评估书、几个问题和一些其他资源,但我仍然找不到直接的答案。

假设我在 R 中有一个公式对象,比如说 x ~ y + z,还有一个函数 f,我定义如下。

f <-函数(.data,a_formula){ .数据%>% select(这里有些东西) }

我想评估 f(df, a_formula) 以给出与 df %>% select(x, y, z) 相同的结果,而无需手动指定公式组件。

我知道 rlang 有几个处理公式的函数,还有来自 base R 的 all.vars(),但我不确定我需要在内部 select() f() 中的函数来评估我想要的方式。最好的答案是只做基本的字符串操作直到我得到我想要的吗?如果整洁的评估有某种方法可以在幕后处理这个问题,我更愿意,因此,例如,f(df, formula(x ~ .)) 会像往常一样 dplyr.[=22 导致 f %>% select(x, everything()) =]

所以基本上我要问的是,有没有办法让我从公式中提取变量并让 select() 正常评估它们?

你基本上已经找到了你需要的所有部分,你只需要将它们与 all_of() 辅助函数放在一起。例如

library(dplyr)

f <- function(.data, a_formula) { 
  .data %>% select(all_of(all.vars(a_formula))) 
}

# test with built-in iris data frame
f(iris, Sepal.Length ~ Sepal.Width)

如果您想为 . 做一些特别的事情,那么只需将其添加到

f <- function(.data, a_formula) { 
   if ("." %in% all.vars(a_formula)) return(.data)
  .data %>% select(all_of(all.vars(a_formula))) 
}
f(iris, Sepal.Length ~ .)