【问题标题】:suppressMessages with a return instead of a print in R?用返回而不是R中的打印来抑制消息?
【发布时间】:2019-10-04 13:19:58
【问题描述】:

我有一个包,其中包含一堆生成 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'而不是默认值?
  • 消息只是变短了。
  • 该消息仅在绘图时生成,因此您可以将suppressMessages 包裹在您对f 的调用周围。值得注意的是 - 如果您分配 f 的结果(即,它不是隐式打印),则不会出现警告
  • 对不起,消息仍然存在,即使在 se=F 时使用 method="loess"。

标签: r ggplot2 suppressmessage


【解决方案1】:

您可以只设置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 package (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))
}

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

【讨论】:

  • 这种新方法是一个绝妙的解决方案!
  • 可能取决于 ggplot2 的版本,但当前的 ggplot2 仍然会打印一条消息:“geom_smooth() using formula 'y ~ x'”。如果您不想收到此消息,则需要传递参数fromula = y ~ x。
【解决方案2】:

根据source code,stat_smooth 和geom_smooth 将打印消息,除非method 和formula 都作为参数给出(此外,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)

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

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2018-01-28
    • 1970-01-01
    • 2013-10-07
    • 2017-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多