我试图将输入变量的名称捕获为字符串。这相当容易使用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)
默认情况下,管道运算符%>%将输入变量名称作为点传递"."给下一个函数,但您可以控制管道运算符的输出,lhs以向您传递输入变量的实际名称,而不是函数中的点。请参阅以下功能(编辑为使用/不使用%>%)
myfun <- function(x) {
x <- substitute(x)
if (x !="."){
print(deparse(x))
}else{
i <- 1
while(!("chain_parts" %in% ls(envir=parent.frame(i))) && i < sys.nframe()) {
i <- i+1
}
ee <- parent.frame(i)
print(deparse(ee$lhs))
}
}
mean %>% myfun()
[1] "mean"
myfun(mean)
[1] "mean"
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。——艾哈迈德·阿尔亨迪