【问题标题】:Passing variable names from formula into tidy function with rlang使用rlang将变量名从公式传递到整洁的函数中
【发布时间】:2021-04-09 08:21:50
【问题描述】:

我一直在阅读整理的评估书、几个问题和其他一些资源,但我仍然找不到直接的答案。

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

f % 选择(这里的东西) }

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

我知道rlang 有一些函数可以处理公式,并且有来自base R 的all.vars(),但我不确定我需要在f() 的内部select() 函数中为此添加什么评估我想要的方式。在我得到我想要的之前只做基本的字符串操作是最好的答案吗?如果有某种方法可以让整洁的评估工作在幕后处理这个问题,我会更喜欢,例如,f(df, formula(x ~ .)) 会像往常一样导致f %>% select(x, everything()) dplyr

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

【问题讨论】:

  • 为什么一定是公式?如果是公式,为什么要使用 2 面公式???。试试f <- function(.data, a_formula) { .data %>% select(all.vars( a_formula)) }

标签: r dplyr rlang tidyeval


【解决方案1】:

您基本上已经找到了您需要的所有部分,您只需将它们与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 ~ .)

【讨论】:

  • 谢谢!我在执行此操作时完全忘记了选择助手。
猜你喜欢
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-24
  • 2013-01-29
  • 2022-11-10
相关资源
最近更新 更多