可能重复:
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+c
和a, b
已被定义为R对象。
我试图做一个类似的功能:
c
所以我真的很困惑什么类型的对象真正传递给foo = function(...) {
print(typeof(...))
}
> foo(a + b)
Error in typeof(...) : object 'a' not found
?无论如何要修改这个对象吗?
答案 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"