我希望在我的包中调用表单时更改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.
函数?
答案 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.
。