Дополнительные аргументы игнорируются в stop()
Я хотел бы изменить значение по умолчанию 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()
Ошибка возникает в r-base в stop.R. Как я могу написать stop
функция, которая ведет себя точно так же, как base::stop
кроме другого значения по умолчанию для call.
аргумент?
1 ответ
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
), а затем позвонитеbase::stop(error)
безcall.
аргумент.