Programmering

Sådan oprettes tabeller i R med udvidelige rækker

Interaktive tabeller med søgning og sortering kan være en god måde at udforske data på. Og nogle gange vil du måske dele disse data med andre mennesker - herunder kun tekstdata som en liste over Gør mere med R-videovejledninger.

Men når disse data inkluderer en kolonne med ret lange poster, passer denne kolonne muligvis ikke godt i en tabel i bredden på din skærm. Dette kan være særligt vanskeligt, når ikke hver række inkluderer den meget brede kolonne. F.eks. Vises der en tabel med spørgeskemaer, hvor et felt er "Har du yderligere kommentarer?" Ikke alle må.

Det er her et bord med udvidelige rækker kan være nyttigt. På NICAR-datajournalistikkonferencen tidligere på året sendte jeg en formular, så højttalere (og andre deltagere) kunne indsende links til sessionpræsentationer. Nogle mennesker tilføjede yderligere kommentarer; andre gjorde det ikke. At vise den kolonne som standard ville spilde en masse af fast ejendom på skærmen.

I stedet vises kommentarfeltet kun i min interaktive tabel med NICAR-ressourcer, hvis en bruger klikker på ikonet for udvidelsesrække. Ikke hver række kan udvides med et klikbart ikon til venstre for emnenavnet, fordi ikke hver række har data i det felt, som du (forhåbentlig kan se på skærmbilledet nedenfor.

Sharon Machlis,

Lad os se, hvordan man laver et bord som dette.

Hvis du gerne vil følge med, skal du installere og indlæse den reagerbare pakke. Til denne demo skal du også have pakkerne rio, lim, htmltools og dplyr installeret.

Du kan downloade de data, jeg bruger i denne demo, fra nedenstående link. Det er et lille (15 rækker) datasæt om R og Python-sessioner på årets NICAR-konference.

download Gør mere med R-demodatasæt til tabeller med udvidelige rækker 15 rækker information om R- og Python-sessioner på NICAR 2020-konferencen om datajournalistik Sharon Machlis

Indlæs reagerbar og dplyr i R

I nedenstående kode indlæser jeg reagerbar og dplyr og importerer derefter mine data ved hjælp af rio :: import ()

bibliotek (reagerbar)

bibliotek (dplyr)

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

Dataene har kolonner for navnet på ressourcen (Hvad), forfatteren (Hvem), TheURL, Tags, Type og Kommentarer.

Dernæst vil jeg oprette en ny kolonne kaldet Ressource med et klikbart link til hver ressource. Jeg skriver bare en lille grundlæggende HTML ved hjælp af kolonnerne Hvad og TheURL for at gøre det lettere for brugerne at komme til ressourcer, der vises i tabellen.

Derefter vælger jeg de kolonner, jeg ønsker, i den rækkefølge, jeg vil have dem.

nicar%

mutere (

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

) %>%

vælg (Ressource, Hvem, Mærker, Type, Kommentarer)

Start med en grundlæggende reagerbar tabel

Endelig opretter jeg en grundlæggende, standard reagerbar tabel.

reagerbar (nicar)

Og denne tabel er grundlæggende. Der er endnu ikke et søgefelt, og kolonnen Ressource viser faktisk HTML-kode i stedet for at vise som HTML

Sharon Machlis,

I den næste kodegruppe tilføjer jeg et søgefelt til tabellen og små pilikoner, der viser, at kolonnerne kan sorteres.

reagerbar (nicar, søgbar = SAND, showSortable = SAND, showSortIcon = SAND)

For at fortælle reaktivt at vise ressourcekolonnen som HTML bruger jeg kolonneargumentet og en liste, hvor colDef angiver attributterne for en eller flere kolonner. Nedenfor sætter jeg ind html = sandt for kolonnen Ressource, så den vises som HTML, og jeg gør også den kolonne tilpaselig.

reagerbar (nicar, søgbar = SAND, showSortable = SAND, showSortIcon = SAND,

kolonner = liste (

Ressource = colDef (html = SAND, resizable = SAND)

)

)

For at fortælle reagerbar ikke at vise kolonnen Kommentarer i hovedtabellen indstillede jeg colDef (show = FALSE).

reagerbar (nicar, søgbar = SAND, showSortable = SAND, showSortIcon = SAND,

kolonner = liste (

Ressource = colDef (html = SAND, resizable = SAND),

Kommentarer = colDef (show = FALSE)

)

)

Så langt så godt.

Sharon Machlis,

Tilføj reagerbar kode til udvidelige rækker

Det næste trin er at tilføje de udvidelige rækker, og det er lidt mere komplekst:

# Funktion nødvendig ifølge Greg Lin, skaberen af ​​reagerbar

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

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

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

}

reagerbar (nicar, søgbar = SAND, showSortable = SAND,

kolonner = liste (

Ressource = colDef (html = SAND, resizable = SAND),

Kommentarer = colDef (show = FALSE)

),

# hvis der findes en kommentar, skal række udvides

detaljer = funktion (indeks) {

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

htmltools :: tagList (

html (nicar $ Kommentarer [indeks])

)

}

}

)

Jeg skrev ikke denne del selv; den reagerbare skaber Greg Lin skrev det. Ærligt talt forstår jeg ikke, hvad hver linje gør. Men det fungerer!

Sharon Machlis

Kan jeg huske denne kode næste gang jeg vil lave en tabel med udvidelige rækker? Nej. Absolut ikke. Men hvis jeg laver en RStudio-kodestykke, Det gør jeg ikke har at huske det. Det er altid kun et par tastetryk væk.

Hvis du overhovedet ikke er fortrolig med RStudio-kodestykker, skal du tjekke afsnittet Gør mere med R om kodestykker for en komplet forklaring. Men her er det grundlæggende.

Lav et RStudio-kodestykke

Nedenfor er et billede af min tabelkode, der fremhæver variablerne for mine dataramme og kolonnenavne, samt ændring af kolonnedefinitionen fra dollartegn til parentesnotation (som fungerer meget bedre i uddrag). Også - meget vigtigt - tilføjede jeg en uddragstitel og indrykkede hver linje kode med en startfane. Det er et must!

Sharon Machlis,

Så skal jeg bare ændre hvert variabelnavn til en generisk uddrag variabel: 1 til datarammen, 2 til den kolonne, jeg vil have vist som HTML, og 3 for kolonnen, der kan udvides. Bemærk den variable syntaks: $ {nummer: variabel_navn}. Disse variabler gør det let for mig at udfylde faktiske variabelnavne tilbage i RStudio.

uddrag my_expandable_row

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

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

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

}

reagerbar ($ {1: mydf}, søgbar = SAND, showSortable = SAND,

kolonner = liste (

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

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

),

detaljer = funktion (indeks) {

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

htmltools :: tagList (

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

)

}

}

)

Du kan kopiere og indsætte uddragskoden ovenfor i din egen RStudio-uddragfil ved hjælp af

bruger dette :: edit_rstudio_snippets ()

for at åbne uddragsfilen i RStudio. Sørg for, at kodestykket for uddrag er almindelige anførselstegn, og at hver linje er indrykket med en fane (ikke kun mellemrum; en startfane for hver linje med kode er obligatorisk).

Hvis du nu skriver navnet på uddraget i en RStudio-kilde R-scriptfil, skal den udvides for at give dig koden. Du kan derefter skrive navnet på den første variabel, trykke på fanen, skrive navnet på din anden variabel osv. Tjek den video, der er indlejret i denne artikel for at se, hvordan dette fungerer. Og nyd dine egne interaktive tabeller med udvidelige rækker!

For flere R-tip, gå til siden Gør mere med R.