【问题标题】:How to detect missing dot-dot-dot in generic function argument如何检测通用函数参数中缺少的点点点
【发布时间】:2014-08-20 01:31:04
【问题描述】:

假设我有一个类似的函数

z <- function(x, ...) {
  print(x)
}

如果缺少...,该函数应该做一件事;如果指定了...,函数应该用它做其他事情。在这种情况下,我可以使用missing(...) 来检测是否缺少..。但是我没有找到一种优雅的方法来检测像[.Obj(x, ...) 这样的通用方法,即使我没有给出值,缺少... 仍然是pairlist(&lt;emptyname&gt;)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

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

Browse[1]> list(...)
Error: argument is missing, with no default
Browse[1]> missing(...)
[1] FALSE

不知何故,适用于z() 的方式不适用于Obj()[]。有没有一种优雅的方法来检测我实际遇到的[.Obj(x, ...) 是否缺少...

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

【问题讨论】:

  • 你能用missing(...)吗?
  • @GSee 它不适用于 [.Obj(x,...) 情况。
  • 目前,我最好的解决方案是if(any(nzchar(substitute(...)))),以防Obj()[f(x)]
  • 或者if (length(list=...) == 0 ) ?

标签: r missing-data


【解决方案1】:

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

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

【讨论】:

  • Curiously ..0 似乎也可以工作,与 ..1 相同,但我在 R-intro.pdf 中找不到此文档,其中 ... 和 ..1 等记录在案...
  • @Spacedman 我试过了,..0 引用了与 ..1 相同的参数。听起来像是“未记录的功能”又名“BUG”。
  • 刚刚检查了来源。 ..1 等通过 util.c 中的 nthcdr 工作 - 如果数字小于 1,则循环往下走……短路。如果你反引号,你可以做..-2
  • 感谢您的解决方案,但这不适用于Obj()[,y]data.table 中使用的类似情况,例如as.data.table(mtcars)[,mean(mpg)]
【解决方案2】:

怎么样:

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

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

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2016-08-27
    • 1970-01-01
    • 2021-10-23
    • 2022-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多