2012-11-08 30 views
37

Khi truyền các giá trị bị thiếu cho ggplot, nó rất tốt và cảnh báo chúng ta rằng chúng có mặt. Điều này có thể chấp nhận được trong một phiên tương tác, nhưng khi viết báo cáo, bạn không có đầu ra lộn xộn với các cảnh báo, đặc biệt là nếu có nhiều báo cáo. Ví dụ dưới đây có một nhãn bị thiếu, trong đó tạo ra một cảnh báo.làm thế nào để ngăn chặn cảnh báo khi vẽ bằng ggplot

library(ggplot2) 
library(reshape2) 
mydf <- data.frame(
    species = sample(c("A", "B"), 100, replace = TRUE), 
    lvl = factor(sample(1:3, 100, replace = TRUE)) 
) 
labs <- melt(with(mydf, table(species, lvl))) 
names(labs) <- c("species", "lvl", "value") 
labs[3, "value"] <- NA 
ggplot(mydf, aes(x = species)) + 
    stat_bin() + 
    geom_text(data = labs, aes(x = species, y = value, label = value, vjust = -0.5)) + 
    facet_wrap(~ lvl) 

enter image description here

Nếu chúng ta quấn suppressWarnings xung quanh biểu hiện cuối cùng, chúng ta có được một bản tóm tắt của bao nhiêu cảnh báo ở đó. Vì lợi ích của lập luận, chúng ta hãy nói rằng điều này là không thể chấp nhận được (nhưng thực sự rất trung thực và chính xác). Làm thế nào để (hoàn toàn) ngăn chặn các cảnh báo khi in một đối tượng ggplot2?

+2

Vì bạn đề cập đến báo cáo: bạn có thể ngăn chặn cảnh báo đầu ra trong knitr. –

+0

Cảm ơn bạn @DieterMenne Tôi cũng sẽ khám phá tùy chọn này. Làm thế nào bạn biết tôi là một fan hâm mộ đan? :) –

Trả lời

30

Một nhắm mục tiêu hơn cốt truyện-by- cách tiếp cận cốt truyện sẽ là thêm na.rm=TRUE vào cuộc gọi âm mưu của bạn. Ví dụ:

ggplot(mydf, aes(x = species)) + 
     stat_bin() + 
     geom_text(data = labs, aes(x = species, y = value, 
           label = value, vjust = -0.5), na.rm=TRUE) + 
     facet_wrap(~ lvl) 
+2

+1 Câu trả lời hay. Nó luôn luôn sẽ tốt hơn để giải quyết nguyên nhân gốc rễ của cảnh báo và đối phó với những điều này, chứ không phải là đàn áp các cảnh báo. – Andrie

+0

+1 Đồng ý với @Andrie, mặc dù tôi thấy nó yên tâm để nhận được cảnh báo về các giá trị bị thiếu - nó giúp tôi có một kiểm tra rằng nó đang làm đúng. Không phải là tôi không tin tưởng Hadley. –

+0

Tất cả các lựa chọn thay thế tốt, nhưng điều này có giải thưởng. –

38

Bạn cần phải suppressWarnings() quanh print() cuộc gọi, không phải là sự sáng tạo của đối tượng ggplot():

R> suppressWarnings(print(
+ ggplot(mydf, aes(x = species)) + 
+ stat_bin() + 
+ geom_text(data = labs, aes(x = species, y = value, 
+        label = value, vjust = -0.5)) + 
+ facet_wrap(~ lvl))) 
R> 

Nó có thể được dễ dàng hơn để gán những âm mưu cuối cùng để một đối tượng và sau đó print().

plt <- ggplot(mydf, aes(x = species)) + 
    stat_bin() + 
    geom_text(data = labs, aes(x = species, y = value, 
           label = value, vjust = -0.5)) + 
    facet_wrap(~ lvl) 


R> suppressWarnings(print(plt)) 
R> 

Lý do hành vi là cảnh báo chỉ được tạo khi lô được vẽ thực sự, không phải khi đối tượng biểu diễn cốt truyện được tạo. R sẽ in tự động trong quá trình sử dụng tương tác, vì vậy trong khi

R> suppressWarnings(plt) 
Warning message: 
Removed 1 rows containing missing values (geom_text). 

không hoạt động bởi vì, trên thực tế, bạn đang gọi print(suppressWarnings(plt)), trong khi

R> suppressWarnings(print(plt)) 
R> 

không làm việc vì suppressWarnings() có thể chụp các cảnh báo phát sinh từ việc Gọi print().

+0

Thú vị cách gọi 'print' hoạt động một cách rõ ràng nhưng không phải khi điều này được thực hiện hoàn toàn bằng cách gọi' ggplot' và không gán nó cho một đối tượng. –

+1

@ RomanLuštrik Đó là bởi vì các cuộc gọi thực tế là một cái gì đó như 'in (suppressWarnings (plt))' nơi bạn muốn 'suppressWarnings (print (plt))' hoặc tôi đã bỏ lỡ những gì bạn có nghĩa là gì? –

+0

Có, bạn đã đóng đinh nó. Tôi không nghĩ đủ về cách in được gọi là ngầm. –

21

Trong câu hỏi của bạn, bạn đề cập đến viết báo cáo, vì vậy nó có thể là tốt hơn để thiết lập mức độ cảnh báo toàn cầu:

options(warn=-1) 

mặc định là:

options(warn=0) 
Các vấn đề liên quan