我有一个功能:
func <- function (x)
{
arguments <- match.call()
return(arguments)
}
1)如果我通过在通话中指定参数调用我的函数:
func("value")
我明白了:
func(x = "value")
2)如果我通过传递变量来调用我的函数:
my_variable <-"value"
func(my_variable)
我明白了:
func(x = my_variable)
为什么第一个和第二个结果不同?
我可以以某种方式进入第二个调用“func(x =”value“)”?
我认为我的问题是函数中的Environment如果通过变量传递则根本不包含值。环境仅包含用于进一步查找的变量名称。有没有办法遵循这样的引用并从函数内部获取价值?
答案 0 :(得分:1)
在R中,当您将my_variable
作为正式参数x
传递给函数时,只有当函数尝试读取my_variable
时才会检索x
的值(如果它不使用x
,则根本不会读取my_variable
。当您传递更复杂的参数时也是如此,例如func(x = compute_my_variable())
- 当compute_my_variable
尝试阅读func
时,对x
的调用将会发生(这称为懒惰的评价)。
鉴于懒惰的评估,你试图做的事情由于副作用而没有明确定义 - 你想以哪种顺序评估参数?你想评估哪些论点? (注意一个函数可以使用substitute
为其参数创建一个表达式,但不对它进行求值)。作为副作用,compute_my_variable
可以修改会影响另一个func
参数结果的内容。即使您只将变量和常量作为参数传递(函数func
可以修改稍后将读取的某些变量,甚至读取my_variable
之类的变量也可能触发将修改的代码,这种情况也会发生稍后将读取的一些变量,例如使用活动绑定或延迟分配)。
因此,如果您只想记录函数的调用方式,则可以使用sys.call
(或match.call
,但确实会扩展参数名称等)。如果您想要更完整的堆栈跟踪,可以使用例如traceback(1)
。
如果由于某种原因你真的想要所有参数的值,就好像它们都按match.call
的顺序读取,这是它们被声明的顺序,你可以使用eval(将它们作为列表返回)来执行:
lapply(as.list(match.call())[-1], eval)
答案 1 :(得分:0)
你不能简单地
return paste('func(x =', x, ')')