[英]How to get the variable name in a function call?
对不起,我的英语很差,但我想不出一个可以简明地描述我的问题的标题,这比标题所暗示的有点复杂。
这是我想要实现的目标:
在全局环境中,可以通过调用deparse(substitute(xyz))
来获取变量的名称,比如xyz
。 我需要在我的代码中的几个地方使用它,所以我决定使它成为一个函数: getVarName <- function(x){deparse(substitute(x))}
。
然后我写了一些函数myfunc
,我需要在其中调用getVarName
:
myfunc <- function(x){cat(getVarName(x))}
现在问题是:当我调用myfunc(y)
时,它仍然打印出x
,而不是打印出y
。 我怀疑它与环境有关,其中substitute()
可以解决问题,但在那个方向上没有运气。
为了做到这一点,我该怎么办?
PS如果有人可以通过更好地描述这个问题来编辑标题,那将是很好的,谢谢!
从我在测试代码时看到的内容来看, deparse(substitute(x))
似乎只打印出调用堆栈中紧邻其下方的变量的名称。 在你的例子中:
getVarName <- function(x){ deparse(substitute(x)) }
myfunc <- function(x){ cat(getVarName(x)) }
myfunc(y)
对getVarName()
的调用是从myfunc()
处理一个名为x
的变量。 实际上,您传递的变量y
不再是调用堆栈的一部分。
解:
只需在要打印变量名称的函数中直接使用deparse(substitute(x))
。 它很简洁,你可以证明没有辅助功能就像拥有辅助功能一样容易。
它通常是一种功能性编程问题,您可以使用装饰器:
decorator = function(f)
{
function(...)
{
print(as.list(match.call()[-1]))
f(...)
}
}
foo = function(x,y,z=2) paste0(x,y,z)
superFoo = decorator(foo)
结果:
> xx=34
> superFoo('bigwhale',xx)
[[1]]
[1] "bigwhale"
[[2]]
xx
[1] "bigwhale342"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.