suppressWarnings() doesn't work with pipe operator

随声附和 提交于 2019-12-08 15:18:49

问题


I am trying to suppress warnings by using the suppressWarnings() function.

Surprisingly, it removes warnings when used normally, but it fails to do so when you use the pipe %>% operator.

Here is some example code :

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

Why does it work with parenthesis but not with pipe operator ? Is there a specific syntax I should use to make it work ?


回答1:


One solution would be to use the %T>% pipes to modify options (from magrittr, not included in dplyr!)

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

You could also use purr::quietly, not so pretty in this case...

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

for the sake of completeness, here are also @docendo-discimus 's solution and OP's own workaround

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

And I'm stealing @Benjamin's comment as to why the original try doesn't work :

Warnings are not part of the objects; they are cast when they occur, and cannot be passed from one function to the next

EDIT:

The linked solution will allow you to just write c("1", "2", "ABC") %W>% as.numeric

Custom pipe to silence warnings



来源:https://stackoverflow.com/questions/46239615/suppresswarnings-doesnt-work-with-pipe-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!