问题 如何通过R中的“...”(省略号)检查是否有任何参数?缺少(...)有效吗?


我想检查R函数的“...”(省略号)参数是否已经输入了一些值/参数。

目前我正在使用类似的东西:

test1 <- function(...) {
   if (missing(...)) TRUE
   else FALSE
}

test1()
## [1] TRUE
test1(something)
## [2] FALSE

它有效,但是 ?missing 并不表示该方式是否正确/有效。

如果以上不正确,那么这样做的方法是什么?或者还有其他更快的方式? PS。我需要这种验证 这个 问题。


6619
2017-10-31 22:48


起源

stackoverflow.com/questions/9877271/... - GSee


答案:


如果您尝试传入一个不存在的对象,这里会抛出一个错误。

test2 <- function(...) if(length(list(...))) FALSE else TRUE

test2()
#[1] TRUE
test2(something)
#Error in test2(something) : object 'something' not found
test2(1)
#[1] FALSE

7
2017-11-01 00:55



+1这可能是最安全的 - Rich Scriven
当然,但我真的很想知道 missing(...) 已验证。 :) BTW,仅用于测试是否存在某些东西 ..., length(list(...))==0 有点儿 比较慢。不管怎样,谢谢! - gagolews
@gagolews它应该更慢,因为它迫使评估。如果不知道你为什么要检查或者你正在用这些信息做什么,很难说什么更好。也许最好扔到这里,也许最好扔掉以后。据推测,如果你发现存在争论,那么你会对它们做些什么 force 评估和错误。 length(list(...)) 也是一个函数调用 missing(...) - GSee
顺便说一句,你说 if (length(list(...))==0),你用过 if (length(list(...)) > 0) 在你的基准。我认为 if (length(list(...))) 稍微快一点(即,将implicity转换为逻辑比比数字更快) - GSee


我认为match.call是你需要的:

test <- function(...) {match.call(expand.dots = FALSE)}

> test()
test()

> test(x=3,y=2,z=5)
test(... = list(x = 3, y = 2, z = 5))

每次在省略号中传递值时它都会给你,如果你不传递任何值,它将为空。

希望有所帮助!


3
2017-11-01 00:29



如果arg列表中有更多参数(“...”除外),我应该测试 any(names(match.call(expand.dots=FALSE)[-1]) == "...")不,我吗? :) - gagolews
如果你一定想让它给你真或假,那么上面的效果很好。如果不这样做,则上述功能也可以使用“...”以外的更多参数。就像你已经知道的那样 test <- function(k=7,...) {match.call(expand.dots = FALSE)} 对于 test(x=3,y=2,z=5,k=5) 回报 test(k = 5, ... = list(x = 3, y = 2, z = 5)) - LyzandeR