【问题标题】:Creating an unevaluated function call with unevaluated but changing arguments使用未评估但不断变化的参数创建未评估的函数调用
【发布时间】: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 调用时,结果会正确使用您定义的nm 中的值。 (如果foo 实际返回value,您的示例可能会更易于使用。)
  • 我的主要目标不是评估,而是记录,实际上是再现类 lm 对象的 $call list-element 之类的东西。
  • 啊,所以你想显示所有符号“展开”到它们的“原始”符号的调用。嗯。
  • 这看起来你可能正在走一条糟糕的 R 路径。如果要通过分析管道跟踪名称,最好将其作为对象上的单独参数或属性显式执行,而不是在函数中要求某些变量名称。与其让我们修复您找到的“解决方案”,不如说出您真正想做的事情。
  • 这就是我想做的。我没有尝试使用单独的参数或属性通过分析管道跟踪名称。我想创建一个未经评估但参数不断变化的未经评估的函数调用。花几个小时想一想。无需修复我的“解决方案”,您可以提出自己的解决方案或声明不可能。那会很有帮助。

标签: r call


【解决方案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)

它会按预期工作。

【讨论】:

  • 谢谢。但这只是将问题推低了一层。如果我这样做,我可以直接在公式中插入quote(n)。理想情况下,我想在 quote() 调用中分配变量。否则,如果我有 100 个对象 n1 到 n100,我需要硬编码 100 个分配 z &lt;- quote(n1) ... z&lt;-quote(n100)
  • 是的,你是对的,但没有办法绕过它...除非z 是一个正式的参数,因为 R 中的函数参数以一种特殊的方式运行。
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 2015-12-01
  • 2014-05-21
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多