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

Kun*_*Ren 5 r missing-data

假设我有一个类似的功能

z <- function(x, ...) {
  print(x)
}
Run Code Online (Sandbox Code Playgroud)

如果...缺少,该功能应该做一件事; 如果...指定,则该函数应该对其执行其他操作.在这种情况下,我可以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")
}
Run Code Online (Sandbox Code Playgroud)

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

> z()
TRUE
> z(a=1)
FALSE
> Obj()[]
FALSE 
NULL
> Obj()[a=1]
FALSE 
NULL
Run Code Online (Sandbox Code Playgroud)

但是,在Obj()[]RStudio的调试模式下,它就像

Browse[1]> list(...)
Error: argument is missing, with no default
Browse[1]> missing(...)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

不知何故,适用的方式z()不起作用Obj()[].是否有一种优雅的方式,几乎没有开销来检测我实际遇到...[.Obj(x, ...)情况是否缺失?

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

G. *_*eck 3

尝试检查是否..1丢失:

> `[.Obj` <- function(x, ...) missing(..1)
> Obj()[a=1]
[1] FALSE
> Obj()[]
[1] TRUE
Run Code Online (Sandbox Code Playgroud)