suppressWarnings() 不适用于管道运算符

Posted

技术标签:

【中文标题】suppressWarnings() 不适用于管道运算符【英文标题】:suppressWarnings() doesn't work with pipe operator 【发布时间】: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 添加到块选项中。 【参考方案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

【讨论】:

以上是关于suppressWarnings() 不适用于管道运算符的主要内容,如果未能解决你的问题,请参考以下文章

Azure 管道不适用于生产

詹金斯管道中的文件存在不适用于 $variant

R 管道 (%>%) 不适用于复制功能

C命名管道不适用于多进程

grep 的管道不适用于尾部? [复制]

composer缓存不适用于bitbucket管道构建