R如何解释......论点?

时间:2012-10-04 23:26:47

标签: r

  

可能重复:
  How to use R's ellipsis feature when writing your own function?

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

例如,考虑包makeContrasts(..., contrasts=NULL, levels)的{​​{1}}。你可以运行:

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+ca, b已被定义为R对象。

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

c

所以我真的很困惑什么类型的对象真正传递给foo = function(...) { print(typeof(...)) } > foo(a + b) Error in typeof(...) : object 'a' not found ?无论如何要修改这个对象吗?

1 个答案:

答案 0 :(得分: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"