stop()中忽略的其他参数

时间:2014-04-15 22:56:44

标签: r cran

我希望在我的包中调用表单时更改call.stop()参数的默认值。因此,程序包包含stop的(非导出)版本,该版本使用另一个默认值:

stop <- function(..., call. = FALSE, domain = NULL){
  base::stop(..., call. = call., domain = domain);
}

这符合我对stop("my error")的意图。但是,当使用条件对象调用stop时,它会发出一个警告:

> stop(simpleError("foo"))
Error: foo
In addition: Warning message:
 In base::stop(..., call. = call., domain = domain) :
 additional arguments ignored in stop()

stop.R中的r-base引发了错误。除了stop参数的不同默认值之外,如何编写与base::stop完全相同的call.函数?

1 个答案:

答案 0 :(得分:3)

base::stop如果您使用条件(例如来自tryCatch的已捕获错误)将其作为参数提供call.来调用,则会始终发出警告domain

这是因为base::stop

中的签入
if (length(args) == 1L && inherits(args[[1L]], "condition")) {
    ....
    if (nargs() > 1L) # give the warning

其中args是您的...

对于call.参数,stop从错误对象本身获取,而不是从call.参数到stop(因此会收到警告)::

stop(simpleError('achtung!'))
# Error: achtung!
stop(simpleError('achtung!'), call.=F) # gives the warning
# Error: achtung!
# In addition: Warning message:
# In stop(simpleError("achtung!"), call. = F) :
#   additional arguments ignored in stop()
stop(simpleError('achtung!', call=call('f')))
# Error in f() : achtung!

根据特定代码中错误的构造方式,您可以在创建错误时将call设置为NULL,以便在调用stop时将其取消。

你可以:

  • 修改调用stop(someConditionObject)的代码,只需使用该对象的消息调用stop(以便不通过该调用)
  • 修改您的stop以测试inherits(args[[1L]], "condition")是否设置为NULL,如果call.=F将其取消(error$call <- NULL),和< / em>然后在没有base::stop(error)参数的情况下调用call.