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

2 回答 2

5

您可以只设置method = 'loess'而不是method = 'auto',这是默认设置:

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 包(v0.3.0)于 2019 年 10 月 4 日创建

我在这里没有看到任何消息,甚至没有短消息。

另一种选择是定义自定义打印函数并为您的输出对象提供不同的类:

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

这将在打印返回的对象时抑制消息。由于这会添加一个类而不是覆盖旧类,因此您仍然可以+毫无问题地添加参数。我仍然会说第一个选择应该是更好的选择。

于 2019-10-04T13:54:04.230 回答
1

根据源代码, stat_smoothandgeom_smooth将打印消息,除非两者methodformula都作为参数给出(此外,method不应该是"auto")。如果你使用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)

(我还删除了额外的赋值和显式的 return 语句,但这是个人喜好问题。)

于 2021-09-10T12:47:59.957 回答