Subskrybuj newsletter o cyfrowej humanistyce i innowacjach w sektorze kultury

Publikujemy raport w R z pakietem bookdown (część II)

Okładka lekcji: kot siedzący przy przypominającej opiekacz maszynie do generowania wykresów / Źródło: AI

Wprowadzenie

W poprzedniej lekcji nauczyliśmy się generować publikacje cyfrowe z wykorzystaniem pakietu bookdown. Podstawą naszej pracy był raport fikcyjnej organizacji pozarządowej na temat muzeum cyfrowego, który przygotowaliśmy w postaci pliku PDF, EPUB i przeszukiwalnej strony internetowej.

Metoda pracy z bookdown jest prosta: przygotowujemy pliki markdown i ustawiamy odpowiednie parametry funkcji render_book. Definiujemy także metadane i ustawienia w pierwszym pliku naszej publikacji (index.Rmd) oraz pliku konfiguracyjnym _bookdown.yml. O tym wszystkim dowiedzieliśmy się w poprzedniej lekcji.

Teraz naszym celem będzie poznanie dodatkowych opcji generowania publikacji oraz sposobów umieszczania w jej internetowej wersji interaktywnych wykresów i tabel.

Przypomnijmy tylko, że pakiet bookdown wykorzystywany jest powszechnie w publikowaniu materiałów naukowych oraz skryptów i opracowań akademickich. Można wykorzystać go także do skonstruowania procesu automatycznego raportowania - program w R pobierać może i przetwarzać określone dane i następnie publikować je automatycznie w postaci plików PDF czy strony internetowej.

Cele lekcji

Celem lekcji jest nauka pracy z pakietem bookdown. Poznamy sposoby umieszczania w publikacji interaktywnych wykresów i tabeli oraz pracować będziemy nad jej formą (fonty, kolory itp.).

Efekty

Efektem naszej pracy będzie m.in. raport w postaci strony WWW uzupełnionej o interaktywne wykresy i tabele. Pamiętajmy, że raport jest fikcyjny (został wygenerowany przez ChatGPT) - interesuje nas jedynie praca nad formą publikacji oraz umieszczenie w niej określonych treści.

Wymagania

Aby skorzystać z tej lekcji, konieczne jest zapoznanie się z poprzednią, będącą wprowadzeniem do pracy w bookdown. Konieczna jest także wiedza na temat podstaw składni języka R i poruszania się w aplikacji Posit.cloud.

Pracujemy w Posit.cloud - należy założyć tam darmowe konto.

Część merytoryczna

Naszą lekcję zaczniemy od przeglądu dodatkowych opcji generowania publikacji. Następnie zajmiemy się dodawaniem interaktywnych elementów do wersji WWW naszego raportu. bookdown - korzystając z innych bibliotek R - pozwala na umieszczanie w publikacjach gotowych skryptów R, które są wykonywane podczas renderowania publikacji.

Zaawansowane ustawienia gitbook

Naszą publikację w postaci strony WWW generowaliśmy za pomocą kodu

render_book("index.Rmd", "bookdown::gitbook", config_file="_bookdown.yml")

Aby bardziej spersonalizować wygląd tej strony, stwórzmy plik _output.yml i dodajmy do niego kilka ustawień:

bookdown::gitbook:
  config:
    toc:
      collapse: subsection
      scroll_highlight: true
      before: null
      after: null
    toolbar:
      position: fixed
    edit : null
    download: ["raport.pdf", "raport.epub"]
    search:
      engine: lunr # or fuse
      # options to control/tune search engine behavior (for
      # fuse.js, refer to https://fusejs.io/api/options.html)
      options: null
    fontsettings:
      theme: night
      family: serif
      size: 2
    sharing:
      facebook: true
      github: false
      twitter: true
      linkedin: false
      weibo: false
      instapaper: false
      vk: false
      whatsapp: false
      all: ['facebook', 'twitter', 'linkedin', 'weibo', 'instapaper']
    info: false

Opis wszystkich ustawień dostępny jest w dokumentacji pakietu. Zwróćmy uwagę na chociaż kilka z nich:

  • sekcja toc (table of contents) zawiera ustawienia spisu treści, wyświetlanego po lewej stronie ekranu. Ustawienie collapse: subsection spowoduje, że nasz spis treści rozwijał się będzie, jeśli w głównych rozdziałach znajdują się podrozdziały (sekcje). Za pomocą opcji before i after możemy dodawać tekst na górę i dół spisu treści - do dobry sposób na umieszczenie w spisie treści tytułu i autora oraz stopki redakcyjnej.
  • ustawienia download: [“raport.pdf”, “raport.epub”] dodają do nagłówka strony element pozwalający na pobranie plików PDF i EPUB z naszą publikacją (uwaga, pliki te nie będą generowane na bieżąco i muszą być dostępne na serwerze),
  • sekcja search pozwala zmienić sposób wyszukiwania na stronie naszej publikacji,
  • w sekcji fontsettings ustawiamy standardowy schemat kolorystyczny publikacji WWW, krój fontów i ich rozmiar. Warto pamiętać o tym, że użytkownik naszej strony może samodzielnie zmieniać te ustwawienia.
  • sekcja sharing pozwala wskazać, ikony jakich mediów społecznościowych pojawią się w nagłówku naszej strony i pozwolą na łatwe udostępnianie tam jej treści.

Alternatywny schemat wyglądu publikacji

Wadą pakietu bookdown jest to, że ustawienia zasad generowania i wyglądu publikacji definiuje się w wielu różnych miejscach. To efekt tego, że ten pakiet łączy w sobie metody z wielu innych pakietów. Na tej stronie możemy zobaczyć przystępne podsumowanie tego, w jakich miejscach edytujemy określone opcje tworzenia publikacji gitbook:

Pliki ustawień publikacji w formacie gitbook

Uwaga: wpisy z _output.yml równie dobrze umieścić można w pliku index.Rmd w kluczu output.

Szablon bs4_book

bookdown pozwala na generowanie responsywnej publikacji WWW w formacie bs4_book, który wykorzystuje popularną bibliotekę CSS Bootstrap. Układ strony jest w tym przypadku trójkolumnowy - dodatkowa kolumna po prawej to generowany dynamicznie spis treści wyświetlanego aktualnie rozdziału:

Publikacja w formacie bs4_book

Ustawienia formatu bs4_book opisane są w dokumentacji:

bookdown::bs4_book:
  theme:
    primary: "#0d6efd"   
    base_font: 
      google: Sen
    heading_font:
      google:
        family: Bitter
        wght: 200
    code_font:
      google: 
        # arguments to sass::font_google() 
        family: DM Mono
        local: false

Zwróćmy uwagę na opcję ustawień fontów (możemy korzystać z zasobów Google Fonts) oraz możliwośc ustawienia dominującego koloru szablonu - w naszym przypadku to #0D6EFD:

Publikacja w formacie bs4_book

Ustawienia definiujemy w pliku _output.yml, a publikację generujemy za pomocą

render_book("index.Rmd", "bookdown::bs4_book", config_file="_bookdown.yml")

Szablon Tufte

W bookdown skorzystać możemy też ze stylu Tufte, który pozwala na generowanie prezentacji WWW lub eleganckich jednostronicowych raportów. Konieczne jest zainstalowanie pakietu tufte:

 install.packages("tufte")
render_book("index.Rmd", "bookdown::tufte_html_book", config_file="_bookdown.yml")

Publikacja w stylu Tufte

Ustawienia szablonu definiujemy - podobnie jak w poprzednich przypadkach - w pliku _output.yml. Na przykład, nasz wielostronicowy (wieloplikowy) raport możemy opublikować jako jeden duży dokument HTML. W tym celu pozbawimy go spisu treści (który zajmuje zbyt wiele miejsca na górze strony) i ustawimy na false sposób wydzielania podstron:

bookdown::tufte_html_book:
  split_by: none
  toc: false

Pamiętajmy, aby zachować poprawną składnię YAML. Ponieważ nasza publikacja to HTML i CSS, możemy dowolnie edytować strukturę i estetykę publikacji tak, aby lepiej odpowiadała naszym wymaganiom. Zmianę koloru tła czy fontów wprowadzić można edytując plik CSS.

Publikacja w stylu Tufte

Warto wiedzieć, że styl Tufte nawiązuje do Edwarda Tufte, amerykańskiego statystyka i jednego z pionierów wizualizacji danych, krytyka prezentacji Power Point jako metody wykładu generującej błędy poznawcze i zaburzającej poprawność wnioskowania na podstawie posiadanych danych statystycznych.

Odpowiednie przygotowanie szablonu może być wymagające, ale jeśli już uda nam się go odpowiednio złożyć, możemy wykorzystywać go do automatycznego generowania wielu publikacji. Być może to interesująca opcja dla instytucji czy organizacji pozarządowych, które publikują swoje treści w seriach, a z jakiegoś powodu nie decydują się na klasyczny skład publikacji.

Interaktywne tabele w publikacjach bookdown

Przejdźmy teraz do drugiego tematu, jaki mieliśmy poruszyć w tej lekcji. Interaktywne wykresy i tabele w publikacjach generowanych przez bookdown umożliwiają dynamiczne eksplorowanie danych. Zamiast statycznych obrazów (plików graficznych z wykresami), interaktywne wykresy umożliwiają zoomowanie, przesuwanie, filtrowanie oraz wyświetlanie dodatkowych informacji przy najechaniu kursorem na konkretne elementy wykresu. Użytkownicy mogą samodzielnie eksplorować dane, identyfikować wzorce i szczegóły, które mogą być niewidoczne na statycznych wykresach. Nasza publikacja nadaje się wtedy nie tylko do lekktury, ale też do - z konieczności ograniczonej - pracy z danymi.

Na GitHub znajdują się fikcyjne dane dotyczące przyrostu zbiorów w naszym muzeum - na ich podstawie przygotujemy tabelę i wykres w pliku statystyki_zbiorow.Rmd. Oto kod w R, którym przygotujemy środowisko do generowania interaktywnego widgetu tabeli i dane, które do niej trafią:

# instalacja niezbednych pakietow

install.packages("DT")

# CSV do data.frame
# file.choose() umożliwi nam ręczne wskazanie pliku csv - dzięki temu nie musimy wpisywać pełnej ścieżki
dane <- read.csv(file.choose())

# zobaczmy nasze dane
View(dane)

# wczytujemy pakiety do środowiska
library(DT)
library(webshot)

Teraz musimy edytować plik statystyki_zbiorow.Rmd - to w tym rozdziale pojawi się tabela.

# Statystyki zbiorów

W 2022 roku Cyfrowe Muzeum Pocztówek udostępniło łącznie 1,200 pocztówek, z czego znacząca część, bo aż 700, pochodziła z regionów Pomorza i Kujaw. Pozostałe pocztówki reprezentowały inne obszary Polski, w tym Mazowsze, Wielkopolskę oraz Małopolskę. Nad procesem digitalizacji i opisywania pocztówek pracowało w 2022 roku 15 wolontariuszy, którzy poświęcili na ten cel łącznie 1,500 godzin. Wolontariusze, zarówno dorośli pasjonaci historii, jak i uczniowie uczestniczący w warsztatach, przyczynili się do dokładnego opisu każdej pocztówki, uwzględniając metadane i konteksty historyczne.

```{r, echo = FALSE}
library(DT)
DT::datatable(dane)
```

W 2023 roku Cyfrowe Muzeum Pocztówek zwiększyło swoje tempo pracy, udostępniając 1,800 pocztówek. Najwięcej z nich, bo aż 1,000, nadal pochodziło z Pomorza i Kujaw, co odzwierciedla główny obszar zainteresowania fundacji Bardzo Lokalne Historie. Z kolei 500 pocztówek pochodziło z Dolnego Śląska, a pozostałe 300 z różnych regionów wschodniej Polski, w tym Lubelszczyzny i Podkarpacia. Liczba wolontariuszy wzrosła do 20 osób, a łączny czas poświęcony na digitalizację i opisywanie pocztówek wyniósł 2,000 godzin. Dzięki zaangażowaniu wolontariuszy, każdy z udostępnionych obrazów został dokładnie opisany i opatrzony odpowiednimi metadanymi.

Do pliku markdown dodajemy program w języku R, który zostanie wykonany podczas generowania publikacji. Aby w pliki .rmd umieścić taki kod, musimy oddzielić go od tekstu - robimy to za pomocą ```. Użycie argumentu echo = FALSE spowoduje, że w naszym rozdziale pojawi się wyłącznie efekt programu w R (nie zawsze chcemy publikować kod źródłowy):

Interaktywna tabela w bookdown

Oczywiście, po edycji plików źródłowych publikacji musimy ponownie wygenerować całość, np. w postaci gitbooka:

render_book("index.Rmd", "bookdown::gitbook", config_file="_bookdown.yml")

Interaktywne wykresy w publikacjach bookdown

Interaktywne wykresy oferują zaawansowane funkcje, takie jak powiększanie, filtrowanie wybranych części wykresu czy tworzenie zrzutów ekranu. Aby dodać interaktywny wykres, skorzystamy z pakietu plotly:

# instalowanie pakietów
install.packages("webshot")
install.packages("plotly")
webshot::install_phantomjs()

# generowanie wykresu

library(plotly)
fig <- plot_ly(dane, x = ~miesiac, y = ~pocztowki_udostepnione, type = 'bar')
fig <- fig %>% layout(title = 'Pocztówki udostępnione w poszczególnych miesiącach',
                      xaxis = list(title = 'Miesiąc'),
                      yaxis = list(title = 'Pocztówki udostępnione'))

# podgląd wykresu
fig

Wykresy w plotly budujemy zgodnie z metodami Grammar of Graphics.

Aby umieścić wykres w naszej publikacji, do pliku statystyki_zbiorow.Rmd znów dodajemy kod R:

```{r, echo = FALSE}
library(plotly)
fig <- plot_ly(dane, x = ~miesiac, y = ~pocztowki_udostepnione, type = 'bar')
fig <- fig %>% layout(title = 'Pocztówki udostępnione w poszczególnych miesiącach',
                      xaxis = list(title = 'Miesiąc'),
                      yaxis = list(title = 'Pocztówki udostępnione'))

fig
```

W efekcie w webowej wersji naszego raportu możemy udostępnić interaktywny wykres, pozwalający zapoznać się z danymi dokumentującymi rozwój naszego projektu:

Interaktywny wykres w bookdown

Podsumowanie

Biblioteka bookdown pozwala nie tylko na generowanie publikacji w rozmaitych formatach i stylach, ale także na łączenie tekstów z kodem R. Chociaż przygotowanie optymalnej postaci publikacji oraz danych i kodu, który będzie je wyświetlał, może wymagać wiele pracy, to daje szansę na prawdziwą automatyzację publikowania.

Wykorzystanie metod

Łączenie teksów z kodem R jest wykorzystywane do tworzenia systemów raportowania w korporacjach oraz w publikowaniu naukowym (szczególnie w podręcznikach).

Pomysł na warsztat

Praca z bookdown może stanowić integralną część warsztatów z języka R. Warsztaty mogą obejmować praktyczne ćwiczenia z tworzenia własnych książek, raportów i dokumentacji, łącząc podstawy automatycznego składu z podstawami tworzenia wykresów i tabel w R.