Jak tworzyć tabele w R z rozwijanymi wierszami

Interaktywne tabele z wyszukiwaniem i sortowaniem mogą być przyjemnym sposobem eksplorowania danych. Czasami możesz chcieć udostępnić te dane innym osobom - w tym dane tekstowe, takie jak lista samouczków wideo Zrób więcej dzięki R.

Ale jeśli te dane zawierają kolumnę z dość długimi wpisami, ta kolumna może nie pasować dobrze do tabeli szerokości ekranu. Może to być szczególnie trudne, gdy nie każdy wiersz zawiera bardzo szeroką kolumnę. Na przykład tabela wyników kwestionariusza, w której jedno pole to „Czy masz dodatkowe uwagi?” Nie każdy może.

Tutaj może się przydać tabela z rozwijanymi wierszami. Na konferencji NICAR poświęconej dziennikarstwu danych na początku tego roku opublikowałem formularz, aby prelegenci (i inni uczestnicy) mogli przesyłać linki do prezentacji z sesji. Niektóre osoby dodały dodatkowe komentarze; inni nie. Domyślne wyświetlenie tej kolumny zmarnuje dużo miejsca na ekranie.

Zamiast tego to pole komentarza jest wyświetlane w mojej interaktywnej tabeli zasobów NICAR tylko wtedy, gdy użytkownik kliknie ikonę rozwijania wiersza. Nie każdy wiersz można rozwinąć za pomocą klikalnej ikony po lewej stronie nazwy tematu, ponieważ nie każdy wiersz zawiera dane w tym polu, jak można (miejmy nadzieję) zobaczyć na poniższym zrzucie ekranu.

Sharon Machlis,

Zobaczmy, jak zrobić taki stół. 

Jeśli chcesz kontynuować, zainstaluj i załaduj pakiet reagujący. Do tego demo będziesz również potrzebować zainstalowanych pakietów rio, glue, htmltools i dplyr.

Możesz pobrać dane, których użyję w tej wersji demonstracyjnej, z linku poniżej. Jest to mały (15 wierszy) zbiór danych dotyczących sesji R i Python na tegorocznej konferencji NICAR.

pobierz Zrób więcej z R Demo Data Set for Tables with Expandable Rows 15 wierszy informacji o sesjach R i Python na konferencji NICAR data journalism 2020 Sharon Machlis

Załaduj reaktywny i dplyr w R.

W poniższym kodzie ładuję pliki reaktywne i dplyr, a następnie importuję dane za pomocą rio::import()

biblioteka (reaktywna)

biblioteka (dplyr)

nicar <- rio :: import ("nicar.csv")

Dane zawierają kolumny z nazwą zasobu (co), autorem (kto), adresem URL, znacznikami, typem i komentarzami.

Następnie chcę utworzyć nową kolumnę o nazwie Zasób z klikalnym łączem do każdego zasobu. Piszę tylko trochę podstawowego kodu HTML, używając kolumn What i TheURL, aby ułatwić użytkownikom dostęp do zasobów wyświetlanych w tabeli.

Następnie wybieram żądane kolumny w kolejności, w jakiej chcę.

nicar%

zmutować(

Zasób = klej :: klej („{Co}”)

)%>%

wybierz (Zasób, Kto, Tagi, Typ, Komentarze)

Zacznij od podstawowego stołu do reakcji 

Na koniec tworzę podstawową, domyślną tabelę z możliwością reakcji.

reaktywny (nikar)

A ten stół jest podstawowy. Nie ma jeszcze pola wyszukiwania, a kolumna Zasoby pokazuje rzeczywisty kod HTML zamiast wyświetlać go jako HTML

Sharon Machlis,

W następnej grupie kodów dodaję pole wyszukiwania do tabeli i małe ikony strzałek wskazujące, że kolumny można sortować.

reagowalne (nicar, searchable = TRUE, showSortable = TRUE, showSortIcon = TRUE)

Aby powiedzieć reagowalny, aby wyświetlał kolumnę Zasób jako HTML, używam argumentu kolumny i listy, gdzie colDef ustawia atrybuty jednej lub więcej kolumn. Poniżej ustawiam html = truekolumnę Zasób, aby była wyświetlana jako HTML, a także zmieniam rozmiar tej kolumny.

reakable (nicar, searchable = TRUE, showSortable = TRUE, showSortIcon = TRUE,

kolumny = lista (

Zasób = colDef (html = TRUE, resizable = TRUE)

)

)

Ustawiłem, aby reaktywny nie wyświetlał kolumny Komentarze w głównej tabeli colDef(show = FALSE).

reakable (nicar, searchable = TRUE, showSortable = TRUE, showSortIcon = TRUE,

kolumny = lista (

Resource = colDef (html = TRUE, resizable = TRUE),

Komentarze = colDef (show = FALSE)

)

)

Jak na razie dobrze.

Sharon Machlis,

Dodaj reaktywny kod dla rozwijanych wierszy

Następnym krokiem jest dodanie rozwijalnych wierszy, a to jest nieco bardziej złożone:

# Funkcja potrzebna według Grega Lina, twórcy narzędzia reaktywnego

html <- function (x, inline = FALSE) {

kontener <- if (inline) htmltools :: span else htmltools :: div

kontener (niebezpiecznieSetInnerHTML = list ("__ html" = x))

}

reagowalne (nicar, searchable = TRUE, showSortable = TRUE,

kolumny = lista (

Resource = colDef (html = TRUE, resizable = TRUE),

Komentarze = colDef (show = FALSE)

),

# jeśli istnieje komentarz, uczyń wiersz rozszerzalnym

szczegóły = funkcja (indeks) {

if (nicar $ Komentarze [indeks]! = "") {

htmltools :: tagList (

html (nicar $ Komentarze [indeks])

)

}

}

)

Sam nie napisałem tej części; napisał go twórca reagujący, Greg Lin. Szczerze mówiąc, nie rozumiem, co robi każda linia. Ale to działa! 

Sharon Machlis

Czy zapamiętam ten kod następnym razem, gdy będę chciał utworzyć tabelę z rozwijanymi wierszami? Nie definitywnie nie. Ale jeśli utworzę fragment kodu RStudio , nie muszę go pamiętać. Zawsze będzie to tylko kilka naciśnięć klawiszy.

Jeśli w ogóle nie znasz fragmentów kodu RStudio, zapoznaj się z odcinkiem Zrób więcej z R na fragmentach kodu, aby uzyskać pełne wyjaśnienie . Ale oto podstawy.  

Utwórz fragment kodu RStudio

Poniżej znajduje się obraz mojego kodu tabeli, który podkreśla zmienne dla moich nazw ramek danych i kolumn, a także zmienia definicję kolumny z notacji znaku dolara na notację w nawiasach (która działa znacznie lepiej we fragmentach). Ponadto - bardzo ważne - dodałem tytuł fragmentu kodu i wciąłem każdy wiersz kodu za pomocą zakładki początkowej. To musi!

Sharon Machlis,

Następnie wystarczy zmienić nazwę każdej zmiennej na ogólną zmienną fragmentu : 1 dla ramki danych, 2 dla kolumny, którą chcę wyświetlić jako HTML, i 3 dla kolumny z rozwijanym wierszem. Zwróć uwagę na składnie zmiennej: ${number:variable_name}. Te zmienne ułatwią mi wpisywanie rzeczywistych nazw zmiennych z powrotem w RStudio. 

snippet my_expandable_row

html <- function (x, inline = FALSE) {

kontener <- if (inline) htmltools :: span else htmltools :: div

kontener (niebezpiecznieSetInnerHTML = list ("__ html" = x))

}

reagowalne ($ {1: mydf}, searchable = TRUE, showSortable = TRUE,

kolumny = lista (

$ {2: html_column} = colDef (html = TRUE, resizable = TRUE),

$ {3: expand_col} = colDef (show = FALSE)

),

szczegóły = funkcja (indeks) {

if ($ {1: mydf} [['$ {3: expand_col}']] [index]! = "") {

htmltools :: tagList (

html ($ {1: mydf} [['$ {3: expand_col}']] [indeks])

)

}

}

)

Możesz skopiować i wkleić powyższy fragment kodu do własnego pliku skrawków RStudio za pomocą

usethis :: edit_rstudio_snippets ()

aby otworzyć plik skrawków w RStudio. Upewnij się, że cudzysłowy fragmentu kodu są zwykłymi cudzysłowami, a każdy wiersz jest wcięty tabulatorem (nie tylko spacjami; tabulator początkowy dla każdego wiersza kodu jest obowiązkowy).

Teraz, jeśli wpiszesz nazwę fragmentu kodu w źródłowym pliku skryptu R RStudio, powinien się on rozwinąć, aby uzyskać kod. Następnie możesz wpisać nazwę pierwszej zmiennej, nacisnąć klawisz tab, wpisać nazwę drugiej zmiennej i tak dalej. Obejrzyj wideo osadzone w tym artykule, aby zobaczyć, jak to działa. I ciesz się własnymi interaktywnymi stołami z rozwijanymi wierszami!

Aby uzyskać więcej wskazówek dotyczących języka R, przejdź na stronę Zrób więcej z R.