对不起,我的英语很差,但我想不出一个可以简明扼要地描述我的问题的标题,这比标题所暗示的要复杂一点。
以下是我想要实现的目标:
在全球环境中,可以通过调用xyz
来获取变量的名称,例如deparse(substitute(xyz))
。我需要在我的代码中的几个地方使用它,所以我决定使它成为一个函数:getVarName <- function(x){deparse(substitute(x))}
。
然后我写了一些函数myfunc
,我需要在其中调用getVarName
:
myfunc <- function(x){cat(getVarName(x))}
现在出现问题:当我致电myfunc(y)
时,它仍会打印出y
,而不是打印x
。我怀疑它与substitute()
处理伎俩的环境有关,但在这方面没有运气。
我该怎样做才能做到正确?
P.S。如果有人可以通过更好地描述这个问题来编辑标题,那就太好了,谢谢!
答案 0 :(得分:2)
从我在测试代码时看到的情况看来,deparse(substitute(x))
似乎只打印出调用堆栈中紧邻其下方的变量的名称。在您的示例中:
getVarName <- function(x){ deparse(substitute(x)) }
myfunc <- function(x){ cat(getVarName(x)) }
myfunc(y)
对getVarName()
的调用正在处理myfunc()
中名为x
的变量。实际上,您传递的变量y
不再是调用堆栈的一部分。
<强>解决方案:强>
直接在要打印变量名称的函数中使用deparse(substitute(x))
。它简明扼要,你可以证明不有一个帮助函数就像拥有一个帮助函数一样容易。
答案 1 :(得分:1)
这通常是一种功能性程序设计问题,您可以使用装饰器:
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"