r - 如何在 R 中的函数内部使用 dplyr/magrittr 的管道?

标签 r dplyr magrittr nse

我正在尝试编写一个函数,该函数将数据帧和函数名称作为参数。当我尝试使用标准 R 语法编写函数时,使用 eval 可以获得不错的结果。和 substitute正如@hadley 在 http://adv-r.had.co.nz/Computing-on-the-language.html 中推荐的那样

> df <- data.frame(y = 1:10)
> f <- function(data, x) {
+   out <- mean(eval(expr = substitute(x), envir = data))
+   return(out)
+ }
> f(data = df, x = y)
[1] 5.5

现在,当我尝试使用 %>% 编写相同的函数时运营商,它不起作用:
> df <- data.frame(y = 1:10)
> f <- function(data, x) {
+   data %>% 
+     eval(expr = substitute(x), envir = .) %>% 
+     mean()
+ }
> f(data = df, x = y)
Show Traceback
Rerun with Debug
 Error in eval(expr, envir, enclos) : objet 'y' introuvable 
> 

如何将管道运算符与 eval 结合使用和 substitute ?这对我来说似乎很棘手。

最佳答案

一种解决方法是

f <- function(data, x) {
  v <- substitute(x)
  data %>% 
    eval(expr = v, envir = .) %>%
    mean()
}

问题是管道函数( %>% )正在创建另一个级别的关闭,这会干扰对 substitute(x) 的评估。 .你可以看到这个例子的不同之处
df <- data.frame(y = 1:10)
f1 <- function(data, x) {
  print(environment())
  eval(expr = environment(), envir = data)
}

f2 <- function(data, x) {
  print(environment())
  data %>% 
    eval(expr = environment(), envir = .)
}
f1(data = df, x = y)
# <environment: 0x0000000006388638>
# <environment: 0x0000000006388638>
f2(data = df, x = y)
# <environment: 0x000000000638a4a8>
# <environment: 0x0000000005f91ae0>

请注意 matrittr 版本中的环境有何不同。你要照顾substitute在进行非标准评估时尽快解决问题。

我希望你的用例比你的例子复杂一点,因为它看起来像
mean(df$y)

将是一个更容易阅读的代码。

关于r - 如何在 R 中的函数内部使用 dplyr/magrittr 的管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35345986/

相关文章:

r - 通过两列和第三列的条件制作一列

r - 使用 R 中的 map() 将列表元素中的列与向量相乘以创建新列

r - dplyr + magrittr + qplot = 没有情节?

r - 使用 `` magrittr : :`%>%` `` 时 magrittr 管道出错

r - magrittr 中的习语 x <- x %>%

r - 为什么 names(x) 比 attr(x, "names") 好?

r - 根据特定模式排列数据框中的行

r - 从包含变音符号的 csv 创建 RSQLite - 然后使用 dplyr 读入

linux - 无法从终端 R 启动 R 帮助文档

r - 在 dplyr 进程中使用自定义函数