2017-09-15 18 views
7

Tôi đang cố gắng ngăn chặn cảnh báo bằng cách sử dụng chức năng suppressWarnings().suppressWarnings() không hoạt động với nhà điều hành đường ống

Đáng ngạc nhiên, nó sẽ loại bỏ cảnh báo khi được sử dụng bình thường, nhưng không làm như vậy khi bạn sử dụng nhà điều hành đường ống %>%.

Dưới đây là một số mã ví dụ:

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ại sao nó làm việc với ngoặc nhưng không phải với nhà điều hành đường ống? Có một cú pháp cụ thể nào tôi nên sử dụng để làm cho nó hoạt động không?

+3

Một cách giải quyết khác có thể là 'c (" 1 "," 2 "," ABC ")%>% {suppressWarnings (as.numeric (.))}' –

+4

Tôi không mong đợi có cách để làm những gì bạn đang cố gắng làm. Toán tử đường ống lấy đối tượng được trả về bởi cuộc gọi trước đó và đẩy nó về phía trước để gọi thành công. Cảnh báo không phải là một phần của đối tượng; chúng được đúc khi chúng xuất hiện và không thể truyền từ một hàm này sang hàm khác. Tôi nghĩ rằng giải pháp dễ đọc nhất là bọc 'suppressWarnings' xung quanh chuỗi cuộc gọi đầy đủ. – Benjamin

+0

Tôi đoán bạn sẽ có cùng một vấn đề với 'try' (để bắt lỗi) – Cath

Trả lời

2

Một giải pháp sẽ được sử dụng %T>% đường ống để sửa đổi tùy chọn (từ magrittr, không được đưa vào dplyr!)

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

Bạn cũng có thể sử dụng purr::quietly, không quá xinh đẹp trong trường hợp này ...

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

vì lợi ích của sự hoàn chỉnh, đây cũng là @ docendo-discimus 's giải pháp và cách giải quyết riêng OP của

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

Và tôi ăn cắp @ bình luận của Benjamin là tại sao lần thử ban đầu không hoạt động:

Cảnh báo không phải là một phần của các đối tượng; họ là những diễn viên khi chúng xảy ra, và không thể được truyền từ một chức năng để tiếp theo

EDIT:

Các giải pháp liên kết sẽ cho phép bạn chỉ cần viết c("1", "2", "ABC") %W>% as.numeric

Custom pipe to silence warnings

Các vấn đề liên quan