我正在尝试编写一个可以简单循环的函数deparse()
,substitute()
如下所示:
get_name <- function(x) {
deparse(substitute(x))
}
的要点get_name()
是返回函数参数的字符对象。get_name()
在我的全局环境中调用时,它正在工作,如下所示:
# no problem here, returns "Variable1" as expected
get_name(x = Variable1)
[1] "Variable1"
当我尝试使用另一个函数时,就会出现问题get_name()
。如下所示:
# a new function that uses get_name()
new_function <- function(arg1) {
get_name(x = arg1)
}
# returns "arg1"
# should be returning "Variable1"
new_function(arg1 = Variable1)
[1] "arg1"
我最初的想法是,一定有办法使用环境来解决这个问题。但是,当我尝试使用eval()
它时,它不起作用,因为Variable1
它实际上不是我全局环境中的对象,它只是我函数参数中的值。
我也尝试过其他函数,例如和rlang
的组合,但不幸的是,它不起作用。as_string()
ensym()
请记住,每个函数调用都会创建一个新的框架来存储其变量。您的
get_name
函数具有与不同的框架new_function
。您希望替换在的框架中进行new_function
,并且substitute
在调用它时引用其第一个参数。我认为这是一个可以满足您要求的函数:
我们首先使用
substitute
获取您想要的名称的参数(示例中为 arg1)并将其存储在中nm
。我们不需要解析,因为我们想要一个语言对象。然后我们用它
parent.frame
来获取调用该函数的框架。然后使用我们已经抓取的名称和父框架
do.call
构造调用,然后解析该结果。substitute
以你的例子来说
new_function
:然后你也可以做这样的事情:
并且情节有基于的标签
get_name
。