如何检测泛型函数参数中缺少的点 - 点

时间:2014-08-20 01:31:04

标签: r missing-data

假设我有像

这样的功能
z <- function(x, ...) {
  print(x)
}

如果缺少...,该函数应该做一件事;如果指定了...,则该函数应该对其执行其他操作。在这种情况下,我可以使用missing(...)来检测是否缺少..。但是我找不到一种优雅的方法来检测[.Obj(x, ...)这样的通用方法,其中...仍然是pairlist(<emptyname>)missing(...) = FALSE,即使我没有z <- function(x, ...) { cat(missing(...)) } Obj <- function() { env <- environment() class(env) <- "Obj" env } `[.Obj` <- function(x,...) { cat(missing(...),"\n") } 。给出价值。

以下是一些实验:

> z()
TRUE
> z(a=1)
FALSE
> Obj()[]
FALSE 
NULL
> Obj()[a=1]
FALSE 
NULL

使用上面的代码评估以下内容:

Obj()[]

但是,在RStudio中Browse[1]> list(...) Error: argument is missing, with no default Browse[1]> missing(...) [1] FALSE 的调试模式中,它就像

z()

某种方式适用于Obj()[]的方法不适用于...。是否有一种优雅的方式,只需要很少的开销来检测我实际遇到的[.Obj(x, ...)案例是否缺少{{1}}?

另请参阅:http://r.789695.n4.nabble.com/Arguments-passing-through-dot-dot-dot-lose-ability-to-check-for-missing-td4656455.html

2 个答案:

答案 0 :(得分:3)

尝试检查是否缺少..1

> `[.Obj` <- function(x, ...) missing(..1)
> Obj()[a=1]
[1] FALSE
> Obj()[]
[1] TRUE

答案 1 :(得分:0)

怎么样:

`[.Obj` <- function(x,...) {
  length(as.list(match.call(expand.dots=TRUE))[-c(1,2)])==1L
}

注意到对于某些函数(例如[.data.frame), empty 参数与不存在的参数(即缺失)不同。