Подтвердить что ты не робот

Как подавлять предупреждения при построении графика с помощью ggplot

При передаче отсутствующих значений в 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

Если мы обернем suppressWarnings вокруг последнего выражения, мы получим краткое изложение того, сколько предупреждений было. Ради споров, скажем, что это неприемлемо (но действительно очень честно и правильно). Как (полностью) подавлять предупреждения при печати объекта ggplot2?

4b9b3361

Ответ 1

Более целевым сюжетным подходом было бы добавить na.rm=TRUE к вашим сюжетным вызовам. Например:.

  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

Вам нужно suppressWarnings() вокруг вызова print(), а не создание объекта 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> 

Может быть проще назначить конечный участок объекту, а затем 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> 

Причиной поведения является то, что предупреждения генерируются только тогда, когда график фактически нарисован, а не когда объект, представляющий график, создается. R будет автоматически печатать во время интерактивного использования, поэтому пока

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

не работает, потому что вы вызываете print(suppressWarnings(plt)), тогда как

R> suppressWarnings(print(plt))
R>

работает, потому что suppressWarnings() может захватывать предупреждения, вызванные вызовом print().

Ответ 3

В вашем вопросе вы упомянете о написании отчетов, поэтому лучше установить глобальный уровень предупреждения:

options(warn=-1)

по умолчанию:

options(warn=0)