【发布时间】:2017-02-22 17:50:10
【问题描述】:
之前的 post 展示了如何使用 quote() 创建对函数的未计算调用,其中参数也未计算:
foo <-function(arg1,arg2){
value <- arg1 + arg2
}
foocall <- call("foo",arg1=quote(x),arg2=quote(y))
foocall
# foo(arg1 = x, arg2 = y)
我怎样才能保持这种质量,但允许 arg1 的规格发生变化。例如,我的环境中有两个命名对象 n 和 m,有时我想跳过一个,有时我想跳过另一个。
## Named objects
n <- c(2,3)
m <- 3
## Case 1: i would like to pass over n
z <-n
call("foo", arg1=quote(z), arg2=quote(y))
## desired output
#foo(arg1 = n, arg2=y)
## Case 2: pass over m
z <- m
call("foo", arg1=quote(z), arg2=quote(y))
## desired output
#foo(arg1 = m, arg2=y)
我很难正确地提出我的问题,但我会这样说:我如何为 arg1 分配一个可以更改但不会评估“一直向下”的变量,但只能分配给名称它绑定到的对象是什么?
【问题讨论】:
-
我不确定我是否遵循。在这两种情况下,当您
eval调用时,结果会正确使用您定义的n或m中的值。 (如果foo实际返回value,您的示例可能会更易于使用。) -
我的主要目标不是评估,而是记录,实际上是再现类 lm 对象的 $call list-element 之类的东西。
-
啊,所以你想显示所有符号“展开”到它们的“原始”符号的调用。嗯。
-
这看起来你可能正在走一条糟糕的 R 路径。如果要通过分析管道跟踪名称,最好将其作为对象上的单独参数或属性显式执行,而不是在函数中要求某些变量名称。与其让我们修复您找到的“解决方案”,不如说出您真正想做的事情。
-
这就是我想做的。我没有尝试使用单独的参数或属性通过分析管道跟踪名称。我想创建一个未经评估但参数不断变化的未经评估的函数调用。花几个小时想一想。无需修复我的“解决方案”,您可以提出自己的解决方案或声明不可能。那会很有帮助。