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?
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
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
@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