【问题标题】:How R interprets ... arguments? [duplicate]R如何解释...论点? [复制]
【发布时间】:2012-09-26 02:09:17
【问题描述】:

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

我想知道 R 如何解释 ... 参数?

例如考虑包limmamakeContrasts(..., contrasts=NULL, levels)。你可以运行:

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

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

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

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

所以我真的很困惑什么类型的对象真正传递给makeContrasts?有没有办法修改这个对象?

【问题讨论】:

  • 在 SO 上搜索[r] ellipsis,您会发现许多问题,您可以从中找到答案。 r-intro 和其他文档也有所有这些信息\
  • 另外,如果你想让你的函数处理像limma::makeContrasts这样的参数,输入limma::makeContrasts来看看它的“内部”。
  • 谢谢,但我已经完成了你推荐的想法。我关于a + b 是什么类型的问题在任何地方都没有得到解答。
  • 这很难回答,因为a + b 有很多东西。它(至少)是:(1)为函数调用makeContrasts(a+b) 提供的(但不匹配的)参数; (2) 存储在... 特殊对象中的promise 对象之一的表达式槽; (3) 一个“调用”或“语言”对象,例如通过输入quote(a + b)返回的
  • 谢谢乔希。最好将其发布为答案,以便我可以将此问题标记为已回答。

标签: r


【解决方案1】:

这是一种“语言表达”。当您将它传递给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"

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2016-04-05
    • 2011-03-26
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多