如何在函数调用中获取变量名?

时间:2015-08-14 09:25:00

标签: r function

对不起,我的英语很差,但我想不出一个可以简明扼要地描述我的问题的标题,这比标题所暗示的要复杂一点。

以下是我想要实现的目标:

在全球环境中,可以通过调用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。如果有人可以通过更好地描述这个问题来编辑标题,那就太好了,谢谢!

2 个答案:

答案 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"