suppressWarnings()不';不要和管道操作员一起工作

suppressWarnings()不';不要和管道操作员一起工作,r,magrittr,R,Magrittr,我试图使用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",

我试图使用
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
为什么它可以使用括号,但不能使用管道操作符?
我是否应该使用特定的语法使其工作?

一种解决方案是使用
%T>%
管道来修改选项(从
magrittr
,不包括在
dplyr
!)

您也可以使用
purrr::安静地
,在本例中不太漂亮

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())
我正在窃取@Benjamin关于为什么最初的尝试不起作用的评论:

警告不是对象的一部分;当它们出现时,它们就会被铸造, 并且不能从一个函数传递到下一个函数

编辑:

链接的解决方案将允许您仅将
c(“1”、“2”、“ABC”)%W>%写入.numeric


另一种解决方法可能是
c(“1”、“2”、“ABC”)%%>%{suppressWarnings(as.numeric()}
我不希望有什么方法可以完成您正在尝试的操作。管道操作符获取前一个调用返回的对象,并将其向前推到下一个调用。警告不是对象的一部分;它们在发生时被强制转换,不能从一个函数传递到下一个函数。我认为最具可读性的解决方案是将
suppressWarnings
包装在整个调用链中。我想您在
try
(捕捉错误)方面也会遇到同样的问题。我认为@Benjamin很好地回答了第一个问题,从而使第二个问题变得无关紧要。谢谢,先生!如果发生在RMarkdown脚本中,可以将
warning=FALSE
添加到块选项中。
c("1", "2", "ABC") %>% {suppressWarnings(as.numeric(.))} 
suppressWarnings(c("1", "2", "ABC") %>% as.numeric())