2017-10-20 86 views
10

Geom z pakietu utworzył linie rozwojowe, a jeśli przepustowość nie jest określona, ​​próbuje znaleźć sensowną wartość. Następnie używa funkcji base R message do zgłaszania tej wartości (patrz https://twitter.com/ClausWilke/status/921363157553172480).Dlaczego ggplot nie pozwala na tłumienie wiadomości generowanych przez jego geomy?

Funkcja base Funkcja R służy do tłumienia takich komunikatów. Na przykład, ten kod wysyła wiadomość:

message('This is a message'); 

i to wyjść kod nic:

suppressMessages(message('This is a message')); 

Jednak z jakiegoś powodu, hamujący wiadomości wydaje się, hm, tłumione gdy geom jest dodawany do ggplot. Poniższy kod ma nadal produkować wiadomość: (. Konkretnie, "Picking joint bandwidth of 319")

require('ggplot2'); 
require('ggridges'); 
suppressMessages(ggplot(Orange, aes(x=age,y=Tree)) + geom_density_ridges()); 

Dlaczego tak jest? Czy ggplot robi coś, aby wiadomości przychodziły niezależnie od specyfikacji użytkowników? Czy jest to właściwie rozsądne zachowanie, o którym po prostu nie wiem?

Podczas generowania raportów RMarkdown opcja porcji message może być ustawiona na message=FALSE, co powoduje anulowanie wszystkich komunikatów na poziomie renderowania. A ponieważ to jest mój przypadek użycia, mój problem został rozwiązany.

A ponieważ Claus Wilke, autor pakietu ggridges, zasugerował, zawsze można ustawić bandwidth ręcznie, aby uniknąć wiadomości (https://twitter.com/ClausWilke/status/921361195231215616).

Ale dlaczego nie usuwa suppressMessages tłumienia wiadomości?

Czy to oczekiwane zachowanie, którego po prostu nie znam?

+0

zauważyłem w dokumentacji to stwierdza 'suppressMessages ocenia swój wyraz w kontekście, który ignoruje wszystkie„proste”messages.' diagnostyczny Zastanawiam się, czy klucz jest tutaj określenie prosty * * ... – Lyngbakr

+4

Jeśli ręcznie zadzwonić 'print' zamiast pozwolić tłumaczowi zająć się tym dla ciebie, wtedy' suppressMessages' tłumi komunikaty. 'suppressMessages (print (ggplot (Orange, aes (x = wiek, y = drzewo)) + geom_density_ridges()))" W pewnym momencie zrozumiałem ten proces nieco lepiej (w jaki sposób przekazywane są komunikaty i jak działa suppressMessages) ale już dawno zapomniałem niektóre szczegóły, więc nie mogę się doczekać prawdziwej odpowiedzi wyjaśniającej "dlaczego". – Dason

+4

@Dason Myślę, że masz to. Komunikaty nie są generowane, dopóki nie wywołasz 'print()' na obiekcie. Jeśli po prostu wpisujesz zmienną w konsoli R, R domyślnie wywołuje 'print()' na tym obiekcie i pokazuje wynik. Jeśli uruchomisz 'supressMessages (ggplot (...)) ', to jest to samo co' print (supressMessages (ggplot (...))) i nie ma żadnych komunikatów generowanych podczas budowania. Potrzebujesz 'supressMessages (print (ggplot (...)))', aby wyciszyć te podczas drukowania. – MrFlick

Odpowiedz

3

Po wywołaniu ggplot(), polecenie to nie narysuje wykresu - tworzy obiekt ggplot. Tylko wydruk tego obiektu jest faktycznie narysowany. Po wpisaniu wyrażenia w konsoli R domyślnym działaniem jest wywołanie wyniku print(), dlatego wydaje się, że ggplot() rysuje wykres.

Należy zauważyć, że ostrzeżenia, których doświadczasz, nie występują podczas tworzenia obiektu ggplot; występują podczas drukowania tego obiektu. Więc jeśli uruchomić

suppressMessages(ggplot(...)) 

to w zasadzie takie same jak

print(suppressMessages(ggplot(...))) 

gdy uruchomiony R w trybie interaktywnym. Ale ponieważ żadne wiadomości nie są generowane przez ggplot(), nic nie jest pomijane, a te wiadomości nadal pojawiają się, gdy drukowany jest wynikowy obiekt. Aby pominąć komunikaty utworzone podczas drukowania, należy owinąć bieżące oświadczenie print() za pomocą suppressMessages().

suppressMessages(print(ggplot(...)))