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() 不适用于管道运算符的主要内容,如果未能解决你的问题,请参考以下文章