在R中,使用返回而不是打印的方式来抑制消息?

4

我有一个包含一系列生成ggplot2对象的函数的程序包。最近,ggplot2更新了一个功能,会提示以下信息:

`geom_smooth()` using method = 'loess' and formula 'y ~ x'

我知道ggplot2为什么会这样说,但我不需要每次运行绘图时都听到它的提示(这会让我的用户感到困惑,因为他们认为他们做错了什么)。我知道我可以通过使用suppressMessages来抑制这些消息,但我不想print一张图表,而是想return它。如果我print它,即使我不想显示它,它也会显示图表。

你有什么想法吗?以下是一个最简示例。

f = function(y,x,data){
    p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth(se=F)
    #suppressMessages(return(p))    ### doesn't work
    suppressMessages(print(p))      ### works, but I don't want to PRINT it
}
data(iris)
head(iris)
f("Sepal.Length", "Sepal.Width", iris)

也许将 method = 'loess' 设置为默认值之外的值? - JBGruber
消息只是变得更短了。 - dfife
只有在绘制图形时才会生成该消息,因此您可以在调用f时将suppressMessages包装起来。值得注意的是,如果您分配了f的结果(即它不是隐式打印),则不会出现警告。 - iod
抱歉,即使使用method="loess"和se=F参数,该消息仍然存在。 - dfife
2个回答

5
你可以将method = 'auto'更改为method = 'loess',后者是默认设置:

library(ggplot2)
f = function(y,x,data){
  p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth(method = "loess")
  return(p)
}

data(iris)

gg <- f("Sepal.Length", "Sepal.Width", iris)
gg

这段内容是由 reprex package (v0.3.0) 在 2019-10-04 创建的。

我这里没有看到任何信息,甚至连简短的一句话都没有。

另一个选择是定义一个自定义打印函数,并为您的输出对象赋予不同的类:

f = function(y,x,data){
  p = ggplot(data, aes_string(x,y)) + geom_point() + geom_smooth()
  class(p) <- c("gg_silent", class(p))
  return(p)
}

print.gg_silent <- function(gg) {
  suppressMessages(ggplot2:::print.ggplot(gg))
}

当返回对象被打印时,这将抑制消息。由于这是添加类而不是覆盖旧类,因此您仍然可以轻松使用 + 添加参数。尽管如此,我认为第一个选项应该更好。

那个新方法是一个非常出色的解决方案! - iod
也许这取决于ggplot2的版本,但当前的ggplot2仍会打印一条消息:“geom_smooth()使用公式'y〜x'”。 如果你不想要这个消息,你需要传递参数formula = y〜x - jarauh

1
根据源代码,除非同时给出methodformula作为参数(此外,method不应为"auto"),否则stat_smoothgeom_smooth将会打印信息。如果使用method = "loess",那么很可能需要formula = y ~ x。因此,以下内容应该可以静默工作:
f = function(y,x,data){
    ggplot(data, aes_string(x,y)) + geom_point() +
        geom_smooth(se=F, method = "loess", formula = y ~ x)
}
data(iris)
head(iris)
f("Sepal.Length", "Sepal.Width", iris)

我还删除了多余的赋值语句和显式返回语句,但这只是个人喜好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接