suppressWarnings()不适用于管道操作员

时间:2017-09-15 12:28:35

标签: r magrittr

我正在尝试使用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

为什么它适用于括号而不适用于管道运算符? 是否有一个特定的语法我应该用它来使它工作?

2 个答案:

答案 0 :(得分:7)

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

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

你也可以使用purr::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

答案 1 :(得分:0)

似乎magrittr的2019版本具有更优雅的解决方案:

%>% {suppressWarnings(function_that_warns(.))}

readme中所述,magrittr现在允许嵌套:

  

x %>% {f(y = nrow(.), z = ncol(.))}等效于f(y = nrow(x), z = ncol(x))