我正在编写一个使用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
我有两个相关的问题:
谢谢!
答案 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
也会按预期工作。
我怀疑这与命名空间或环境以及/ qplot
和ggplot
评估参数的时间有关。但同样,这只是猜测...
答案 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")