【问题标题】:suppressWarnings() doesn't work with pipe operatorsuppressWarnings() 不适用于管道运算符
【发布时间】:2018-02-24 15:34:04
【问题描述】:

我正在尝试使用 suppressWarnings() 函数来抑制警告。

令人惊讶的是,它在正常使用时会删除警告,但在使用管道 %>% 运算符时却无法这样做。

这是一些示例代码:

library(magrittr)

c("1", "2", "ABC") %>% as.numeric()
# [1]  1  2 NA
# Warning message:
# In function_list[[k]](value) : NAs introduced by coercion

c("1", "2", "ABC") %>% as.numeric() %>% suppressWarnings
# [1]  1  2 NA
# Warning message:
# In function_list[[i]](value) : NAs introduced by coercion

suppressWarnings(c("1", "2", "ABC") %>% as.numeric())
# [1]  1  2 NA

为什么它可以使用括号而不是管道运算符? 我应该使用特定的语法来使其工作吗?

【问题讨论】:

  • 另一种解决方法可能是c("1", "2", "ABC") %>% {suppressWarnings(as.numeric(.))}
  • 我不希望有办法做你想做的事。管道运算符获取前面调用返回的对象并将其推送到后面的调用。警告不是对象的一部分;它们在发生时被强制转换,并且不能从一个函数传递到下一个函数。我认为最易读的解决方案是将suppressWarnings 包裹在整个调用链中。
  • 我猜你对try 也会有同样的问题(捕获错误)
  • 我认为@Benjamin 很好地回答了第一个问题,因此使第二个问题无关紧要。谢谢先生!
  • 如果出现在 RMarkdown 脚本中,您可以将 warning = FALSE 添加到块选项中。

标签: r magrittr


【解决方案1】:

一种解决方案是使用%T>% 管道来修改选项(来自magrittr,不包括在dplyr 中!)

c("1", "2", "ABC") %T>% {options(warn=-1)} %>% as.numeric() %T>% {options(warn=0)}

你也可以使用purrr::quietly,在这种情况下不是很漂亮...

library(purr)
c("1", "2", "ABC") %>% {quietly(as.numeric)}() %>% extract2("result")
c("1", "2", "ABC") %>% map(quietly(as.numeric)) %>% map_dbl("result")

为了完整起见,这里还有 @docendo-discimus 的解决方案和 OP 自己的解决方法

c("1", "2", "ABC") %>% {suppressWarnings(as.numeric(.))} 
suppressWarnings(c("1", "2", "ABC") %>% as.numeric())

我窃取了@Benjamin 关于为什么最初的尝试不起作用的评论:

警告不是对象的一部分;它们在出现时被投射, 并且不能从一个函数传递到下一个函数

编辑:

链接的解决方案将允许您只写c("1", "2", "ABC") %W>% as.numeric

Custom pipe to silence warnings

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2017-01-23
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    相关资源
    最近更新 更多