Как подавить предупреждение о пропускной способности qplot внутри функции?

Я пишу функцию, которая использует qplot() для рисования гистограммы, например,

> library(ggplot2)
> d=rnorm(100)
> myfun=function(x) qplot(x)

Запуск он дает предупреждение:

> myfun(d)
stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.

Чтобы подавить предупреждение, я пробовал самостоятельно вычислить binwidth, но это дает ошибку и не выводит на экран:

> myfun=function(x) print(qplot(x, binwidth=diff(range(x))/30))
> myfun(d)
Error in diff(range(x)) : object 'x' not found

У меня есть два связанных вопроса:

  • Что здесь происходит? Почему объект 'x' не найден?
  • Как я могу написать функцию, чтобы предупреждение не генерировалось?

Спасибо!

Ответ 1

Я не могу объяснить причину этого (Хэдли может колебаться и делать это), но использование ggplot вместо qplot решает проблему:

d <- data.frame(v1 = rnorm(100))
myfun <- function(x){
    p <- ggplot(data = x, aes(x = v1)) + 
                    geom_histogram(binwidth = diff(range(x$v1))/30)
    print(p)
}

Выполняя это, я не получаю предупреждающего сообщения. Кроме того, использование ggplot и удаление части binwidth = ... в geom_histogram заставляет предупреждение снова появляться, но затем suppressMessages работает так же, как ожидалось.

Я подозреваю, что это связано с пространствами имен или средами, и когда /where qplot и ggplot оценивают аргументы. Но опять же, это просто догадка...

Ответ 2

Чтобы попытаться устранить некоторую путаницу, эта конструкция не предотвращает появление предупреждений/сообщений о ширине полосы пропускания:

suppressMessages(p <- ggplot(...))
print(p)

Но это делает:

p <- ggplot(...)
suppressMessages(print(p))

Как указывает комментарий Хэдли, ленивая оценка предотвращает фактически выполнение функций stat_*, пока они не будут нуждаться во время печати. ​​

Ответ 3

Как говорится по телевизору "Если бы это было настоящим предупреждением, вам дали бы указания от ваших локальных властей".

Поскольку это не было предупреждением, мой первоначальный ответ не вызывал ошибки. Вот что я должен был написать:

options(warnings= -1)
<do something> # no warnings
options(warnngs=1)
<business as usual>

Но это было не предупреждение, а сообщение на консоль. Здесь, как остановить его:

 con=file("temp.fil", "w")
 sink(con, type="message")
 library(ggplot2)
  d=rnorm(100)
  myfun=function(x) qplot(x)
  myfun(d)
 sink( type="message")