Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

suppressWarnings() doesn't work with pipe operator

Tags:

r

magrittr

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 ?

like image 680
Dan Chaltiel Avatar asked Sep 15 '17 12:09

Dan Chaltiel


1 Answers

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 purrr::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

like image 139
Moody_Mudskipper Avatar answered Oct 08 '22 19:10

Moody_Mudskipper