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))