我想要一个可以使用管道操作符从dplyr导出的函数.我没有使用magrittr.
df %>% my_function
Run Code Online (Sandbox Code Playgroud)
我如何获得df名称?如果我试试
my_function <- function(tbl){print(deparse(substitute(tbl)))}
Run Code Online (Sandbox Code Playgroud)
它返回
[1] "."
Run Code Online (Sandbox Code Playgroud)
虽然我想[1]"df"
有什么建议吗?
谢谢你在前进,
尼古拉
我希望能够打印通过管道传递的数据帧的名称.这可能吗?我可以.
printname <- function(df){
print(paste(substitute(df)))
}
printname(mtcars)
#[1] "mtcars"
Run Code Online (Sandbox Code Playgroud)
但是,它返回"." 当使用管道管道此功能时magrittr.
mtcars %>% printname
# [1] "."
Run Code Online (Sandbox Code Playgroud)
在编写已记录的生产过程中使用的函数的自定义错误消息时,这将非常有用 - 如果日志中唯一的内容是".",则很难知道哪些内容失败了.
它可能足以返回原始调用,其中包括该mtcars %>%部分.
我试图将输入变量的名称捕获为字符串。这相当容易使用match.call(),但是在使用 magrittr 的管道时这不起作用。想知道是否有任何简单的修改可以让它在管道中工作以及函数是否被正常调用?
library(magrittr)
myfun <- function(fun){
print(match.call()$fun %>% as.character())
}
myfun(mean)
mean %>% myfun
myfun(iris)
iris %>% myfun
Run Code Online (Sandbox Code Playgroud) 我只是想了解这里出了什么问题.在第一种情况(工作)中,我将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 …Run Code Online (Sandbox Code Playgroud)