R和Python里得到传入参数的变量名

问题

同事写R程序的时候,问我能不能获取一个变量的name, 我说这个好办啊,在R里可以这样写,用quote()

> a <- 1
> quote(a)
a

不过我把问题想简单了,他实际需要的是要获得传入 参数的name。例如定义一个函数foo(c), 给它传入参数a,我能够在函数 内部知道传入参数的名字a

我说可以增加一个参数嘛。把参数的名字直接传入。

> foo(a,"a")

但是我立刻意识到,这里存在重复,而写代码是提倡 do not repeat yourself的。而且对R这种可以随意获取环境变量的高级语言。 肯定有办法做到。

python可以做到

但是我还是先看看Python吧,毕竟最近用Python 多一些。Google关键字python print variable name and value,立刻可以获得 答案。这段代码的思想也很直白,就是对输入的obj在环境变量(名称,对象)键值对 中查找,返回名称。

def namestr(obj, namespace=globals()):
    return [name for name in namespace if namespace[name] is obj]

这样可以这样使用

>>> a = 1
>>> namestr(a)
['a']

R也可以

那么R肯定也有办法做到。Google关键字 r print variable name and value

myfunc <- function(v1) {
  deparse(substitute(v1))
}

myfunc(foo)
[1] "foo"

真是很不错啊。把结果告诉了同事,他也很高兴。 但是substitute()deparse()究竟是啥意思呢?在R里输入?substitute,可以 看到解释。

substitute returns the parse tree for the (unevaluated) expression expr, substituting any variables bound in env.

够晦涩难懂的吧。不过仔细思考一下,也大概明白了。 在R里,从语法角度来说,所有都是expr,(这跟其他语言都是statement不同) 在R的函数里,可以对传入的未进行求值的expr进行操作。这点非常有趣。 而deparse(),比较好理解了至少在我看来,与as.character()的作用是一样的。