Hur man skapar tabeller i R med utökningsbara rader

Interaktiva tabeller med sökning och sortering kan vara ett trevligt sätt att utforska data. Och ibland kanske du vill dela den informationen med andra människor - inklusive endast textdata som en lista med Gör mer med R-videohandledning.

Men när data innehåller en kolumn med ganska långa poster, kanske den kolumnen inte passar bra i en tabell på skärmens bredd. Detta kan vara särskilt svårt när inte varje rad innehåller den mycket breda kolumnen. Exempelvis visas en frågeformulärstabell där ett fält är "Har du några ytterligare kommentarer?" Inte alla kanske.

Det är där ett bord med expanderbara rader kan vara till nytta. På NICARs datainformationskonferens tidigare i år lade jag ut ett formulär så att högtalare (och andra deltagare) kunde skicka länkar till presentationer. Vissa människor har lagt till ytterligare kommentarer; andra inte. Att visa den kolumnen som standard skulle slösa bort mycket skärmfastigheter.

Istället visas det kommentarfältet i min interaktiva tabell med NICAR-resurser endast om en användare klickar på ikonen för expandera rad. Inte varje rad kan utökas med en klickbar ikon till vänster om ämnesnamnet eftersom inte varje rad har data i det fältet, som du kan (förhoppningsvis) se på skärmdumpen nedan.

Sharon Machlis,

Låt oss se hur man gör ett sådant bord. 

Om du vill följa med, installera och ladda det reagerbara paketet. För denna demo behöver du också paketet rio, lim, htmltools och dplyr installerat.

Du kan ladda ner de data jag ska använda i denna demo från länken nedan. Det är en liten (15 rader) datamängd om R- och Python-sessioner vid årets NICAR-konferens.

ladda ner Gör mer med R-demodata för tabeller med utbyggbara rader 15 rader med information om R- och Python-sessioner vid NICAR-datainformationskonferensen 2020 Sharon Machlis

Ladda reagerbart och dplyr i R

I koden nedan laddar jag reaktivt och dplyr och importerar sedan mina data med rio::import()

bibliotek (reagerbart)

bibliotek (dplyr)

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

Data har kolumner för namnet på resursen (Vad), författaren (Vem), TheURL, Taggar, Typ och Kommentarer.

Därefter vill jag skapa en ny kolumn som heter Resurs med en klickbar länk till varje resurs. Jag skriver bara lite HTML med kolumnerna What och TheURL för att göra det lättare för användare att komma till resurser som visas i tabellen.

Sedan väljer jag de kolumner jag vill ha i den ordning jag vill ha dem.

nicar%

mutera(

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

)%>%

välj (Resurs, Vem, Taggar, Typ, Kommentarer)

Börja med en grundläggande reagerbar tabell 

Slutligen skapar jag en grundläggande, standardreaktabel tabell.

reagerbar (nicar)

Och den här tabellen är grundläggande. Det finns ingen sökruta ännu och kolumnen Resurs visar den faktiska HTML-koden istället för att visas som HTML

Sharon Machlis,

I nästa kodgrupp lägger jag till en sökruta i tabellen och små pilikoner som visar att kolumnerna är sorterbara.

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

För att säga att reagerbart ska visa kolumnen Resurs som HTML använder jag kolumnerargumentet och en lista där colDef anger attributen för en eller flera kolumner. Nedan ställer jag in html = truekolumnen Resurs så att den visas som HTML, och jag gör också att kolumnen kan ändras.

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

kolumner = lista (

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

)

)

För att berätta för reaktivt att inte visa kolumnen Kommentarer i huvudtabellen ställde jag in colDef(show = FALSE).

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

kolumner = lista (

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

Kommentarer = colDef (visa = FALSE)

)

)

Än så länge är allt bra.

Sharon Machlis,

Lägg till reagerbar kod för expanderbara rader

Nästa steg är att lägga till de expanderbara raderna, och det är lite mer komplicerat:

# Funktion behövs enligt Greg Lin, skapare av reagerbar

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

behållare <- if (inline) htmltools :: span else htmltools :: div

behållare (dangerouslySetInnerHTML = lista ("__ html" = x))

}

reagerbar (nicar, sökbar = SANT, showSortable = SANT,

kolumner = lista (

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

Kommentarer = colDef (visa = FALSE)

),

# om det finns en kommentar, gör raden utökbar

detaljer = funktion (index) {

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

htmltools :: tagList (

html (nicar $ Comments [index])

)

}

}

)

Jag skrev inte den här delen själv; den reagerbara skaparen Greg Lin skrev det. Ärligt talat, jag förstår inte vad varje rad gör. Men det fungerar! 

Sharon Machlis

Kommer jag ihåg den här koden nästa gång jag vill skapa en tabell med utökningsbara rader? Nej. Definitivt inte. Men om jag gör en RStudio kodsträng , jag har inte har att komma ihåg det. Det är alltid bara några tangenttryckningar borta.

Om du inte känner till RStudio-kodavsnitt alls, kolla in avsnittet Gör mer med R om kodavsnitt för en fullständig förklaring . Men här är grunderna.  

Skapa ett RStudio-kodavsnitt

Nedan finns en bild av min tabellkod som visar variablerna för min dataram och kolumnnamn, samt ändrar kolumndefinitionen från dollarteckennotation till parentesnotering (som fungerar mycket bättre i utdrag). Också - mycket viktigt - jag lade till en kodtitel och sänkte varje rad kod med en startflik. Det är ett måste!

Sharon Machlis,

Då behöver jag bara ändra varje variabelnamn till en generisk kodvariabel : 1 för dataramen, 2 för kolumnen som jag vill visa som HTML och 3 för den expanderbara radkolumnen. Notera den rörliga syntax: ${number:variable_name}. Dessa variabler gör det enkelt för mig att fylla i faktiska variabelnamn tillbaka i RStudio. 

utdrag my_expandable_row

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

behållare <- if (inline) htmltools :: span else htmltools :: div

behållare (dangerouslySetInnerHTML = lista ("__ html" = x))

}

reagerbar ($ {1: mydf}, sökbar = SANT, showSortable = SANT,

kolumner = lista (

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

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

),

detaljer = funktion (index) {

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

htmltools :: tagList (

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

)

}

}

)

Du kan kopiera och klistra in kodavsnittet ovan i din egen RStudio-kodfil med

usethis :: edit_rstudio_snippets ()

för att öppna utdragsfilen i RStudio. Se till att kodcitationstecknen är enkla citat och att varje rad är indragen med en flik (inte bara mellanslag; en startflik för varje kodrad är obligatorisk).

Om du nu skriver namnet på kodavsnittet i en RStudio-käll R-skriptfil, ska den expandera för att ge dig koden. Du kan sedan skriva namnet på den första variabeln, slå på fliken, skriva namnet på din andra variabel och så vidare. Kolla in videon inbäddad i den här artikeln för att se hur detta fungerar. Och njut av dina egna interaktiva bord med utbyggbara rader!

För fler R-tips, gå till sidan Gör mer med R.