上一篇文章展示了如何使用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 分配一个可以更改但不计算"一路向下"的变量,而只分配给它绑定的对象的名称?
当你这样做时
> z <- n
右侧被计算,因此符号z
被分配值n
,而不是符号n
本身。
> z
[1] 2 3
现在与
> z <- quote(n)
现在z
的值是一个符号,即符号n
。
> z
n
因此,现在您可以做
> call('foo', arg1=z, arg2=quote(y))
foo(arg1 = n, arg2 = y)
它将按预期工作。