Aktualizacja: Poprosiłem Paul Murrell (dalej „bossa”), a on powiedział mi, że decyzję o otwarciu nowej strony jest wykonany w src/library/graphics/src/graphics.c
przez GNewPlot
:Jak sprawdzić, czy działka jest kompletny lub nie
pGEDevDesc GNewPlot(Rboolean recording)
Skutecznie sprawdza, czy par(mfg)
i par(new)
decydują, czy otworzyć nową stronę. Jak wykonać ten test w pakiecie dodatków?
Rozwiązanie z użyciem czystego kodu R lub kodu C jest dopuszczalne.
knitr
wykorzystuje pakiet evaluate
do oceny fragmentów kodu R i wyniki przechwytywania, w tym działek. Krótko mówiąc, evaluate
wywołuje recordPlot()
, aby zarejestrować migawkę bieżącego wykresu po wyliczeniu każdego wyrażenia kodu, a także gdy wywołania haczyków takie jak before.plot.new
i before.grid.newpage
są wywoływane (zwykle dzieje się to przed narysowaniem nowego wykresu). Dla tych "Luke'a", proszę use the source, jeśli to nie jest wystarczająco jasne.
Po utworzeniu migawki musimy zdecydować, czy ją zachować, ponieważ migawka może nie zostać zmieniona po ocenie nowego wyrażenia, które nie ma związku z wykreślaniem. Teraz przychodzi mój problem: jeśli wykres zawiera sub-działki (na przykład pairs()
, coplot()
lub par(mfrow = c(2, 3))
w grafice bazowej R), nie powinniśmy przechowywać niekompletnych migawek. W poniższym przykładzie, pierwsze trzy działki należy wyrzucić:
par(mfrow = c(2, 2))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
Aby to osiągnąć, możemy porównać par("mfg")[1:2]
do par("mfg")[3:4]
(jak widać w kodzie źródłowym), i to działa dobrze w niektórych przypadkach, ale nie wszystko, na przykład, issue #25:
layout(matrix(c(1,3,2,3), 2))
plot(rnorm(10))
plot(rnorm(10))
plot(rnorm(10))
teraz jak mam wiedzieć, fabuła nie jest zakończona przed linią 4? Sztuczka mfg
już nie działa.
Szukałem odpowiedzi na ten problem przez długi czas i będę naprawdę wdzięczny, jeśli ktoś może dać mi wskazówkę; dalsze szczegóły znajdują się w dwóch powyższych linkach i mogę wyjaśnić, czy coś jest niejasne. Uważam, że musi istnieć rozwiązanie, ponieważ wszystkie urządzenia R wiedzą, kiedy rozpocząć nowy ekran lub plik wydruku, a niekompletne wykresy nie uruchamiają nowych ekranów lub plików wydruku.
Naprawdę uważam, że nie da się określić, czy fabuła jest kompletna i nie będzie późniejszego wyrażenia R, które rozszerzyłoby to dalej. To, co zrobiłem w [pander] (http://rapporter.github.io/pander) z funkcją 'evals' (której używam zamiast' assess' dla jakiegoś dodatkowego), to że użytkownik może "oznaczyć" linię z wiodącym znakiem '+', który ma być zawarty w ostatniej nazwie działki - to naprawdę nieoptymalne rozwiązanie, ale nie mogłem wymyślić lepszego pomysłu. Więcej szczegółów: http://support.rapporter.net/entries/22485898-How-to-evaluate-multiple-commands-together – daroczig
Definiowanie layoutu niekoniecznie oznacza, że wszystkie komórki będą w końcu używane, czy nie ? Mogę sobie wyobrazić sytuacje, w których jedna cela jest celowo pusta. Nie byłoby potrzeby "dev.off()", jeśli istnieje określona odpowiedź, myślę. – baptiste
@daroczig dzięki! Myślę, że to jest rzeczywiście nieoptymalne; @ Baptiste masz rację; można "dev.off()" zanim wszystkie komórki zostaną wypełnione, i to nie jest dla mnie problemem –