Programmering

Hvordan lage tabeller i R med utvidbare rader

Interaktive tabeller med søk og sortering kan være en fin måte å utforske data på. Og noen ganger kan det være lurt å dele dataene med andre mennesker - inkludert kun tekstdata som en liste over videoopplæringsprogrammer.

Men når disse dataene inkluderer en kolonne med ganske lange oppføringer, kan det hende at den kolonnen ikke passer godt i en tabell på skjermens bredde. Dette kan være spesielt vanskelig når ikke hver rad inkluderer den veldig brede kolonnen. For eksempel resulterer det i en spørretabell der ett felt er "Har du noen ekstra kommentarer?" Ikke alle kan.

Det er her et bord med utvidbare rader kan komme godt med. På NICAR-datajournalistikkonferansen tidligere i år la jeg ut et skjema slik at høyttalere (og andre deltakere) kunne sende lenker til sesjonspresentasjoner. Noen la til flere kommentarer; andre ikke. Å vise den kolonnen som standard vil kaste bort mye skjermeiendom.

I stedet vises det kommentarfeltet i den interaktive tabellen min med NICAR-ressurser bare hvis en bruker klikker på ikonet for utvidelsesraden. Ikke hver rad kan utvides med et klikkbart ikon til venstre for emnetavnet, fordi ikke hver rad har data i det feltet, som du (forhåpentligvis) kan se på skjermbildet nedenfor.

Sharon Machlis,

La oss se hvordan du lager et bord som dette.

Hvis du vil følge med, installer og last inn den reagerbare pakken. For denne demoen trenger du også rio-, lim-, htmltools- og dplyr-pakkene installert.

Du kan laste ned dataene jeg skal bruke i denne demoen fra lenken nedenfor. Det er et lite (15 rader) datasett om R og Python-økter på årets NICAR-konferanse.

last ned Gjør mer med R Demodatasett for tabeller med utvidbare rader 15 rader med informasjon om R- og Python-økter på NICAR datajournalistikkonferansen 2020 Sharon Machlis

Last reagerbar og dplyr i R

I koden nedenfor laster jeg inn reagerbar og dplyr og importerer deretter dataene mine ved hjelp av rio :: import ()

bibliotek (reagerbart)

bibliotek (dplyr)

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

Dataene har kolonner for navnet på ressursen (Hva), forfatteren (Hvem), TheURL, Tagger, Type og Kommentarer.

Deretter vil jeg opprette en ny kolonne kalt Resource med en klikkbar lenke til hver ressurs. Jeg skriver bare litt grunnleggende HTML ved hjelp av Hva og TheURL-kolonnene for å gjøre det lettere for brukere å komme til ressursene som vises i tabellen.

Deretter velger jeg kolonnene jeg vil ha i den rekkefølgen jeg vil ha dem.

nicar%

mutere (

Ressurs = lim :: lim ("{What}")

) %>%

velg (Ressurs, Hvem, Merker, Type, Kommentarer)

Start med en grunnleggende reagerbar tabell

Til slutt oppretter jeg en grunnleggende, standard reagerbar tabell.

reagerbar (nicar)

Og denne tabellen er grunnleggende. Det er ingen søkeboks ennå, og ressurskolonnen viser faktisk HTML-kode i stedet for å vise som HTML

Sharon Machlis,

I neste kodegruppe legger jeg til et søkefelt i tabellen og små pilikoner som viser at kolonnene kan sorteres.

reagerbar (nicar, søkbar = TRUE, showSortable = TRUE, showSortIcon = TRUE)

For å fortelle reaktivt å vise ressurskolonnen som HTML, bruker jeg kolonneargumentet og en liste der colDef angir attributtene til en eller flere kolonner. Nedenfor setter jeg inn html = sant for ressurskolonnen, slik at den vises som HTML, og jeg gjør også størrelsen på den kolonnen større.

reagerbar (nicar, søkbar = TRUE, showSortable = TRUE, showSortIcon = TRUE,

kolonner = liste (

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

)

)

For å fortelle reagerbar å ikke vise kolonnen Kommentarer i hovedtabellen, satte jeg opp colDef (show = FALSE).

reagerbar (nicar, søkbar = TRUE, showSortable = TRUE, showSortIcon = TRUE,

kolonner = liste (

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

Kommentarer = colDef (show = FALSE)

)

)

Så langt så bra.

Sharon Machlis,

Legg til reagerbar kode for utvidbare rader

Neste trinn er å legge til de utvidbare radene, og det er litt mer komplisert:

# Funksjon som trengs i følge Greg Lin, skaper av reagerbar

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

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

container (dangerouslySetInnerHTML = list ("__ html" = x))

}

reagerbar (nicar, søkbar = TRUE, showSortable = TRUE,

kolonner = liste (

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

Kommentarer = colDef (show = FALSE)

),

# hvis det finnes en kommentar, gjør raden utvidbar

detaljer = funksjon (indeks) {

if (nicar $ Comments [index]! = "") {

htmltools :: tagList (

html (nicar $ Comments [indeks])

)

}

}

)

Jeg skrev ikke denne delen selv; den reagerbare skaperen Greg Lin skrev det. Ærlig talt, jeg forstår ikke hva hver linje gjør. Men det fungerer!

Sharon Machlis

Vil jeg huske denne koden neste gang jeg vil lage en tabell med utvidbare rader? Nei. Definitivt ikke. Men hvis jeg lager en RStudio-kodebit, Jeg gjør ikke ha å huske det. Det vil alltid være bare et par tastetrykk unna.

Hvis du ikke er kjent med RStudio-kodebiter i det hele tatt, kan du se avsnittet Gjør mer med R på kodebiter for en fullstendig forklaring.. Men her er det grunnleggende.

Lag et RStudio-kodebit

Nedenfor er et bilde av tabellkoden min som fremhever variablene for datarammen og kolonnenavnene, samt å endre kolonnedefinisjonen fra dollartegn til brakettnotasjon (som fungerer mye bedre i utdrag). Også - veldig viktig - jeg la til en tittel og innrykket hver kodelinje med en startfane. Det er et must!

Sharon Machlis,

Da trenger jeg bare å endre hvert variabelnavn til et generisk utdragsvariabel: 1 for datarammen, 2 for kolonnen jeg vil vise som HTML, og 3 for den utvidbare kolonnen. Legg merke til den variable syntaksen: $ {number: variable_name}. Disse variablene vil gjøre det enkelt for meg å fylle ut faktiske variabelnavn tilbake i RStudio.

utdrag min_utvidbare_row

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

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

container (dangerouslySetInnerHTML = list ("__ html" = x))

}

reagerbar ($ {1: mydf}, søkbar = TRUE, showSortable = TRUE,

kolonner = liste (

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

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

),

detaljer = funksjon (indeks) {

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

htmltools :: tagList (

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

)

}

}

)

Du kan kopiere og lime inn kodebiten ovenfor i din egen RStudio-kodebit ved hjelp av

bruker dette :: edit_rstudio_snippets ()

for å åpne utdrag-filen i RStudio. Forsikre deg om at kodestatistikkene er enkle anførselstegn og at hver linje er innrykket med en fane (ikke bare mellomrom; en startfane for hver kodelinje er obligatorisk).

Nå hvis du skriver inn navnet på kodebiten i en RStudio-kilde R-skriptfil, bør den utvides for å gi deg koden. Du kan deretter skrive inn navnet på den første variabelen, trykke på fanen, skrive inn navnet på den andre variabelen og så videre. Sjekk ut videoen som er innebygd i denne artikkelen for å se hvordan dette fungerer. Og nyt dine egne interaktive bord med utvidbare rader!

For flere R-tips, gå til Do More With R-siden.

$config[zx-auto] not found$config[zx-overlay] not found