suppressWarnings() не работает с оператором канала

Я пытаюсь подавить предупреждения с помощью 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

Почему это работает с круглыми скобками, но не с оператором трубы? Есть ли определенный синтаксис, который я должен использовать, чтобы он работал?

1 ответ

Решение

Одним из решений будет использование %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())

И я краду комментарий @ Бенджамина о том, почему оригинальная попытка не работает:

Предупреждения не являются частью объектов; они преобразуются, когда они происходят, и не могут быть переданы от одной функции к следующей

РЕДАКТИРОВАТЬ:

Связанное решение позволит вам просто написать c("1", "2", "ABC") %W>% as.numeric

Пользовательская труба, чтобы заставить замолчать предупреждения

Кажется что 2019 версия magrittr имеет более элегантное решение:

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

Как объяснено в readme, magrittr Теперь разрешено вложение:

x %>% {f(y = nrow(.), z = ncol(.))} эквивалентно f(y = nrow(x), z = ncol(x))

Другие вопросы по тегам