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()
的作用是一样的。