我有以下代码:
library(magrittr)
a <- function(cars) return(cars)
b <- function(x) return(list(varname = deparse(substitute(x)), content = x))
b(cars)
返回带有字符串cars
和data.frame内容的列表cars
。
有什么办法a(cars) %>% b()
还可以返回字符串cars
(由函数返回的变量的名称a()
)和data.frame的内容?
相反,它返回.
和data.frame的内容。
也就是说,我希望第二个函数返回第一个函数返回的变量的名称以及变量的内容。
我实际上想要做的b()
是类似write.csv(x, paste0(deparse(substitute(x)), ".csv"))
。
有什么建议?
如果您看一下%>%
操作员内部的调用堆栈,您将得到如下内容
a(cars) %>% (function(x) sys.calls())
# [[1]]
# a(cars) %>% (function(x) sys.calls())
# [[2]]
# withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
# [[3]]
# eval(quote(`_fseq`(`_lhs`)), env, env)
# [[4]]
# eval(expr, envir, enclos)
# [[5]]
# `_fseq`(`_lhs`)
# [[6]]
# freduce(value, `_function_list`)
# [[7]]
# withVisible(function_list[[k]](value))
# [[8]]
# function_list[[k]](value)
# [[9]]
# (function (x) sys.calls())(.)
您可以看到您的函数最终何时被调用,与原始表达式相比,您已经有了很多距离。问题在于该参数可能已在链中重新分配。考虑这种情况
a <- 6
b <- a
f <- function(x) deparse(substitute(x))
f(b)
# [1] "b"
但是R无法知道b
实际来自a
。没有办法在这样的作业中向后走。substitute
只有在您仍然可以访问传递给函数的Promise时,它才能像这样工作。
因此问题在于,当您在链中调用函数时,已经对其进行了重新分配,.
这就是为什么您无法再访问原始“名称”的原因。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句