2017-09-15 35 views
7

Próbuję ukryć ostrzeżenia za pomocą funkcji suppressWarnings().suppressWarnings() nie działa z operatorem potoku

Co zaskakujące, usuwa ostrzeżenia, gdy jest używany normalnie, ale nie robi tego podczas korzystania z operatora rury %>%.

Oto przykładowy kod:

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 

Dlaczego to działa w nawiasie, ale nie z operatorem rury? Czy istnieje specjalna składnia, której powinienem użyć, aby działała?

+3

Innym obejściem może być "c (" 1 "," 2 "," ABC ")%>% {suppressWarnings (jako .numeryczne (.))}' –

+4

Nie oczekuję, że istnieje sposób, aby zrobić to, co próbujesz do zrobienia. Operator potoku przyjmuje obiekt zwrócony przez poprzednie wywołanie i przekazuje je do następnego połączenia. Ostrzeżenia nie są częścią obiektów; są rzucane, gdy występują, i nie mogą być przekazywane z jednej funkcji do drugiej. Myślę, że najbardziej czytelnym rozwiązaniem jest ominięcie 'suppressWarnings' wokół całego łańcucha wywołań. – Benjamin

+0

Myślę, że miałbyś ten sam problem z 'try' (aby uchwycić błędy) – Cath

Odpowiedz

2

Jednym rozwiązaniem byłoby wykorzystanie rur %T>% zmodyfikować opcje (z magrittr, nieuwzględnione w dplyr!)

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

Można również użyć purr::quietly, nie tak ładna w tym przypadku ...

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

dla kompletności wywodu, oto też @ rozwiązanie docendo-discimus „s i własne obejście OP

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

A ja kradzież @ komentarza Benjamina, dlaczego oryginalna próba nie działa:

Ostrzeżenia nie są częścią obiektów; oni są odlewane w momencie ich wystąpienia, i nie mogą być przekazywane z jednej funkcji do następnej

EDIT:

połączone rozwiązanie pozwoli Ci tylko napisać c("1", "2", "ABC") %W>% as.numeric

Custom pipe to silence warnings