Подавлять сообщения, отображаемые "печатью" вместо "сообщения" или "предупреждения" в R

Многие R-пакеты, с которыми я работаю, включают функции, которые предоставляют все свои сообщения и предупреждения через команды для вызовов print(), а не команд message() или warning(). Я хотел бы иметь возможность отключать эти индикаторы прогресса работы и т.д., Но стандартные недопустимые предупреждения() или supressMessages этого не делают. Есть ли способ, которым я могу просто подавить печать?

Например:

silly_developer_function <- function(x){
   print("Thanks for using my function!!")
   if(is(x, "numeric"))
     print("warning, x should be a character")
   x
}

Я хотел бы иметь простую функцию suppressPrint(), которую я мог бы обернуть вокруг вызова этой функции, которая будет подавлять предупреждения и бесполезные сообщения (но все равно печатать возвращаемое значение).

Ответы

Ответ 1

Ну, эти пакеты с ошибками начинаются. Использование print() для чего-либо, кроме побочного эффекта в реализациях print, является серьезной ошибкой.

Тем не менее, вы можете просто использовать capture.output() для сбора вывода из такого кода вместо его печати. Таким образом, для вышесказанного было бы

capture.output(x <- silly_developer_function(...))
print(x)

Ответ 2

Еще один хакерский способ - переопределить функцию print по умолчанию. Это повлияет на некоторые функции, такие как печать тела функций, но объекты со своими собственными методами печати все равно возвращаются, как обычно.

print <- function(...) {}

> silly_developer_function("a")
[1] "a"
> silly_developer_function(1)
[1] 1