2012-11-08 19 views
37

Eksik değerleri ggplot'a iletirken, çok naziktir ve mevcut olduklarını bize bildirir. Bu etkileşimli bir oturumda kabul edilebilir, ancak raporlar yazarken, özellikle de birçoğu varsa çıktılar uyarılarla karıştırılmaz. Aşağıda, bir uyarı veren bir etiket eksik var. ggplot ile çizim yaparken uyarıların nasıl bastırılacağı

enter image description here

geçen ifadenin etrafında suppressWarnings sarın Eğer

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) 

, orada olduğumuzu kaç uyarılar bir özetini olsun. Tartışma uğruna, bunun kabul edilemez olduğunu söyleyelim (ama aslında çok dürüst ve doğrudur). Bir ggplot2 nesnesini yazdırırken uyarıları nasıl (tamamen) bastırırız? Nihai bir nesneye arsa ve sonra print() atamak kolay olabilir

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> 

:

+2

Raporlamadan bahsettiğinizden beri: knitr'deki uyarı çıktısını kaldırabilirsiniz. –

+0

Teşekkür ederiz @DieterMenne Bu seçeneği de keşfedeceğim. Örgü hayranı olduğumu nasıl bildin? :) –

cevap

30

bir daha hedefli arsa-by- arsa yaklaşımı, arsa çağrılarınıza na.rm=TRUE eklemek olacaktır. E.g .:

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 Güzel yanıt. Uyarıların bastırılmasından çok, uyarıların temel nedenini ele almak ve bunlarla uğraşmak her zaman daha iyi olacaktır. – Andrie

+0

+1 @Andrie ile katılıyorum, ancak eksik değerler hakkında uyarı almak için bana güveniyorum - bu doğru şeyi yaptığımı kontrol etmeme yardımcı olur. Tabi ki Hadley'e güvenmiyorum. –

+0

Tüm iyi alternatifler, ancak bu ödül alır. –

38

Sen print() çağrı değil ggplot() nesnenin yaratılması etrafında suppressWarnings() gerekir.

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> 

davranışın nedeni arsa aslında arsa temsil nesne oluşturulduğunda değilken, çizildiğinde uyarılar yalnızca üretilen olmasıdır. R aslında, sen print(suppressWarnings(plt)) aradığınız, çünkü

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

iken suppressWarnings() kaynaklanan uyarıları çalışma yakalayabilir çünkü

R> suppressWarnings(print(plt)) 
R> 

oysa çalışmıyor bu yüzden, interaktif kullanım sırasında otomatik baskı olacak print() çağrı. Sorunuza olarak

+0

'print' işlevini açıkça çağıran, ancak 'ggplot' çağrılarak örtük bir şekilde yapıldığında ve bir nesneye atanmadığında ne kadar ilginç olur. –

+1

@ RomanLuštrik Bu, asıl çağrının baskı (baskılama (plt)) yazdırma baskısı (print (plt)) gibi bir şey olduğu anlamına mı geliyor, yoksa ne demek istediğimi mi özledim? –

+0

Evet, sen çiviledin. Basımın örtük olarak nasıl adlandırıldığı konusunda yeterince düşünmedim. –

21

, rapor yazma söz, nedenle küresel ısınma seviyesini ayarlamak için daha iyi olabilir:

options(warn=-1) 

varsayılan:

options(warn=0)