在 stop() 中忽略的附加参数

Jer*_*oen 3 r cran

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

stop <- function(..., call. = FALSE, domain = NULL){
  base::stop(..., call. = call., domain = domain);
}
Run Code Online (Sandbox Code Playgroud)

这符合我的意图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()
Run Code Online (Sandbox Code Playgroud)

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

mat*_*fee 5

base::stop如果您使用条件(例如从 a 捕获错误tryCatch)作为参数供应call.or调用它,则将始终发出该警告domain

这是因为check in base::stop

if (length(args) == 1L && inherits(args[[1L]], "condition")) {
    ....
    if (nargs() > 1L) # give the warning
Run Code Online (Sandbox Code Playgroud)

这里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!
Run Code Online (Sandbox Code Playgroud)

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

你可以:

  • 修改您调用的代码,stop(someConditionObject)使其仅stop使用该对象的消息进行调用(以便不传递调用)
  • 修改stop测试是否inherits(args[[1L]], "condition")并设置呼叫NULL,如果call.=F压制它(error$call <- NULL),并且然后调用base::stop(error)call.参数。