ela*_*din 3 r lazy-evaluation dplyr tidyeval rlang
我只是想了解这里出了什么问题.在第一种情况(工作)中,我将enquo()-ted参数分配给变量,在第二种情况下,我在调用中直接使用了enquoted参数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
Run Code Online (Sandbox Code Playgroud)
编辑 这里有更多的思路:)
将调用包含到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))
Run Code Online (Sandbox Code Playgroud)
如果你告诉它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))
Run Code Online (Sandbox Code Playgroud)
如果您不使用管道,它也可以使用
# 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))
Run Code Online (Sandbox Code Playgroud)
关于错误消息,当人们试图传递data.frames不支持的类型时,就会得到这个消息.
mutate(df,value = function(x)x)#mutate_impl(.data,dots)中的错误:列value是不受支持的类型闭包
对我来说,好像myfun_2中的quosure没有被评估mutate,这是某种有趣/非直观的行为.你认为我应该向开发者报告吗?
在rlang 0.2.0中解决了这个限制.
技术上:问题的核心是magrittr评估其在当前环境中的孩子的论点.这是包含.代词的环境.从0.2.0开始,使用enquo()和变体捕获参数现在是词法范围的,这意味着它查找父环境的堆栈以找到要捕获的参数.这解决了magrittr问题.
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |