如何在函数内抑制qplot的binwidth警告?

时间:2011-09-18 00:42:15

标签: r ggplot2

我正在编写一个使用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'?
  • 如何编写函数以便不生成警告?

谢谢!

3 个答案:

答案 0 :(得分:9)

我无法解释为什么这个(Hadley可能会这样做),但使用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也会按预期工作。

我怀疑这与命名空间或环境以及/ qplotggplot评估参数的时间有关。但同样,这只是猜测...

答案 1 :(得分:8)

要尝试消除一些混淆,此构造不会阻止出现binwidth警告/消息:

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

但这样做:

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

正如Hadley的评论指出的那样,懒惰的评估会阻止stat_*函数在打印时需要实际运行。

答案 2 :(得分:1)

正如他们在电视上说的那样“如果这是一个真正的警告,你会得到当地政府的指示。”

因为它不是警告,所以我的原始答案并没有导致它出错。这是我应该写的:

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")