2

可能重复:
编写自己的函数时如何使用 R 的省略号功能?

我想知道 R 如何解释 ... 论点?

例如考虑makeContrasts(..., contrasts=NULL, levels)package limma。你可以运行:

 > require(limma)
 > makeContrasts(a + b, b+c, levels=letters[1:3])

       Contrasts
 Levels a + b b + c
      a     1     0
      b     1     1
      c     0     1

并且它解释a + b, b+c没有a, b并且c已经被定义为 R 对象的参数。

我试图做一个类似的功能:

foo = function(...) {
    print(typeof(...))
}

> foo(a + b) 
Error in typeof(...) : object 'a' not found

所以我真的很困惑真正传递给什么类型的对象makeContrasts?无论如何要修改这个对象吗?

4

1 回答 1

3

它是一种“语言表达”。当您将它传递给typeof解释器时,它会尝试查找要匹配的名称a并失败,因此会产生错误。如果您使用处理“语言”类型项目的函数处理它,您会得到(更)合理的结果。

看看这个:

> a="aa"
> typeof(a+b)
Error in typeof(a + b) : object 'b' not found
> b="bb"
> typeof(a+b)
Error in a + b : non-numeric argument to binary operator

我们修复了不存在的问题a,然后 R 解释器希望能够找到b它,然后它意识到+没有给出数字参数。因此,解释器试图以a+b通常的方式评估表达式并在遇到问题时报告问题。在我对您当时关于模仿的不完整问题的回答中,makeContrasts我提供了一种机制来查看 R 解释器对该表达式的操作:

 foo = function(...) {
      e <- substitute(...)
      e[[1]]
 }

  foo(a + b)
# `+`

当您想检查工作区中不是命名元素的某些东西的性质时,typeof否则它会期望获得字符值,您需要quote它:

> typeof(quote(a+b))
[1] "language"
> typeof(quote("a"))
[1] "character"
于 2012-10-05T00:14:27.610 回答