Дополнительные аргументы игнорируются в 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. аргумент.
Другие вопросы по тегам