【问题标题】:enquo() inside a magrittr pipelinemagrittr 管道中的 enquo()
【发布时间】:2018-03-02 17:44:12
【问题描述】:

我只是想了解这里出了什么问题。 在第一种情况下(工作),我将enquo()-ted 参数分配给一个变量,在第二种情况下,我直接在对mutate 的调用中使用引用的参数。

library("dplyr")
df <- tibble(x = 1:5, y= 1:5, z = 1:5)

# works
myfun <- function(df, transformation) {
  my_transformation <- rlang::enquo(transformation)
  df %>% 
    gather("key","value", x,y,z) %>% 
    mutate(value = UQ(my_transformation))
}
myfun(df,exp(value))

# does not work
myfun_2 <- function(df, transformation) {
  df %>% 
    gather("key","value", x,y,z) %>% 
    mutate(value = UQ(rlang::enquo(transformation)))
}
myfun_2(df,exp(value))
#>Error in mutate_impl(.data, dots) : Column `value` is of unsupported type closure

编辑 这里还有一些需要考虑的行:)

将调用包装到 quo() 中,看起来好像要评估的表达式是正确“构建”的

# looks as if the whole thing should be working
myfun_2_1 <- function(df, transformation) {
  quo(df %>% 
    gather("key","value", x,y,z) %>% 
    mutate(value = UQ(rlang::enquo(transformation))))
}
myfun_2_1(df,exp(value))

如果你把这个告诉eval_tidy,它会起作用(没有 quo() 就不起作用)

# works
myfun_2_2 <- function(df, transformation) {
  eval_tidy(quo(df %>% 
    gather("key","value", x,y,z) %>% 
    mutate(value = UQ(rlang::enquo(transformation)))))
}
myfun_2_2(df,exp(value))

如果你不使用管道,它也可以工作

# works
myfun_2_3 <- function(df, transformation) {
  mutate(gather(df,"key","value", x,y,z), value = UQ(rlang::enquo(transformation)))
}
myfun_2_3(df,exp(value))

关于错误消息,当一个人尝试传递 data.frames 不支持的类型时,例如,这是得到的。

变异(df,值=函数(x)x) # mutate_impl(.data, dots) 中的错误:value 列的闭包类型不受支持

在我看来,myfun_2 中的 quosure 似乎没有由 mutate 评估,这在某种程度上是有趣/不直观的行为。你认为我应该向开发人员报告这件事吗?

【问题讨论】:

  • 顺便说一下,在管道期间查看 data.frame - “gather()”之后的序列时,它说“value”列是整数类型
  • 我会将您的问题重命名为:在 magrittr 管道中使用 enquo()

标签: r dplyr lazy-evaluation rlang tidyeval


【解决方案1】:

rlang 0.2.0 解决了这个限制。

从技术上讲:问题的核心是 magrittr 在当前环境的子节点中评估其参数。这是包含. 代词的环境。从 0.2.0 开始,使用 enquo() 和变体捕获参数现在是词法范围的,这意味着它会查找父环境的堆栈以找到要捕获的参数。这解决了 magrittr 问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 2018-07-23
    • 2018-04-29
    • 2019-12-27
    • 2021-08-10
    • 2015-03-30
    • 2016-08-11
    相关资源
    最近更新 更多