我试图通过使用该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
Run Code Online (Sandbox Code Playgroud)
为什么它适用于括号而不适用于管道操作符?我应该使用特定的语法来使其工作吗?
一种解决方案是使用%T>%管道来修改选项(来自magrittr,不包含在dplyr!中)
c("1", "2", "ABC") %T>% {options(warn=-1)} %>% as.numeric() %T>% {options(warn=0)}
Run Code Online (Sandbox Code Playgroud)
你也可以使用purr::quietly,在这种情况下不是那么漂亮......
library(purr)
c("1", "2", "ABC") %>% {quietly(as.numeric)}() %>% extract2("result")
c("1", "2", "ABC") %>% map(quietly(as.numeric)) %>% map_dbl("result")
Run Code Online (Sandbox Code Playgroud)
为了完整起见,这里也是@ docendo-discimus的解决方案和OP自己的解决方法
c("1", "2", "ABC") %>% {suppressWarnings(as.numeric(.))}
suppressWarnings(c("1", "2", "ABC") %>% as.numeric())
Run Code Online (Sandbox Code Playgroud)
而且我正在窃取@Benjamin关于为什么原始尝试不起作用的评论:
警告不是对象的一部分; 它们在发生时被转换,并且不能从一个函数传递到下一个函数
编辑:
链接的解决方案将允许您只写 c("1", "2", "ABC") %W>% as.numeric