У меня есть обертка вокруг встроенной функции warning() в R, которая в основном вызывает warning(sprintf(...)):
warningf <- function(...)
    warning(sprintf(...))
Это потому, что я часто использовал warning(sprintf(...)), что решил сделать из него функцию (это в пакете у меня есть функции, которые я часто использую).
Затем я использую warningf, когда я пишу функции. то есть вместо записи:
f <- function() {
    # ... do stuff
    warning(sprintf('I have %i bananas!',2))
    # ... do stuff
}
Пишу:
f <- function() {
    # ... do stuff
    warningf('I have %i bananas!',2)
    # ... do stuff
}
Если я вызываю первый f(), я получаю:
Warning message:
In f() : I have 2 bananas!
Это хорошо - это говорит мне, откуда появилось предупреждение от f() и что пошло не так.
Если я вызываю второй f(), я получаю:
Warning message:
In warningf("I have %i bananas!",2) : I have 2 bananas!
Это не идеально - он говорит мне, что предупреждение было в функции warningf (конечно, потому что это функция warningf, которая вызывает warning, а не f)), маскируя тот факт, что она действительно появилась из функции f().
Итак, мой вопрос: могу ли я как-то "поднять" вызов warning, чтобы он отображал сообщение warning in f() вместо warning in warningf?