创建一个未计算的函数调用未评估的,但改变参数(Creating an unevaluated fun

2019-09-25 20:39发布

先前的帖子说明了如何使用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可以改变,但不评估“一路向下”的变量,但只对对象的名称它必然?

Answer 1:

当你做

> 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)

它会正常工作。



文章来源: Creating an unevaluated function call with unevaluated but changing arguments
标签: r call