suppressWarnings()函数无法与管道操作符一起使用

20

我试图使用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

为什么在括号中可以工作而在管道操作符中却不行?是否有特定的语法应该使用以使其起作用?


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

20

一种解决方法是使用%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

自定义管道以消除警告


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