Come creare tabelle in R con righe espandibili

Le tabelle interattive con ricerca e ordinamento possono essere un bel modo per esplorare i dati. E a volte, potresti voler condividere quei dati con altre persone, compresi i dati di solo testo come un elenco di tutorial video su Do More With R.

Ma quando quei dati includono una colonna con voci abbastanza lunghe, quella colonna potrebbe non adattarsi bene a una tabella della larghezza dello schermo. Questo può essere particolarmente complicato quando non tutte le righe includono la colonna molto ampia. Ad esempio, una tabella dei risultati del questionario in cui un campo è "Hai commenti aggiuntivi?" Non tutti possono.

È qui che può tornare utile una tabella con righe espandibili. Alla conferenza NICAR sul giornalismo sui dati all'inizio di quest'anno, ho pubblicato un modulo in modo che i relatori (e altri partecipanti) potessero inviare collegamenti alle presentazioni della sessione. Alcune persone hanno aggiunto ulteriori commenti; altri no. Mostrare quella colonna per impostazione predefinita sprecherebbe un sacco di spazio sullo schermo.

Invece, quel campo di commento viene visualizzato nella mia tabella interattiva delle risorse NICAR solo se un utente fa clic sull'icona di espansione della riga. Non tutte le righe possono essere espanse con un'icona cliccabile a sinistra del nome dell'argomento perché non tutte le righe hanno dati in quel campo, come puoi (si spera) vedere nello screenshot qui sotto.

Sharon Machlis,

Vediamo come realizzare un tavolo come questo. 

Se desideri seguire, installa e carica il pacchetto Reattibile. Per questa demo, avrai bisogno anche dei pacchetti rio, glue, htmltools e dplyr installati.

Puoi scaricare i dati che userò in questa demo dal link sottostante. È un piccolo set di dati (15 righe) sulle sessioni R e Python alla conferenza NICAR di quest'anno.

scarica Do More With R Demo Data Set for Tables with Expandable Rows 15 righe di informazioni sulle sessioni R e Python alla conferenza NICAR data journalism 2020 Sharon Machlis

Carica reattiva e dplyr in R

Nel codice seguente, carico Reactable e dplyr e quindi importi i miei dati usando rio::import()

libreria (reattiva)

libreria (dplyr)

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

I dati hanno colonne per il nome della risorsa (Cosa), l'autore (Chi), TheURL, Tag, Tipo e Commenti.

Successivamente, voglio creare una nuova colonna chiamata Risorsa con un collegamento cliccabile a ciascuna risorsa. Sto solo scrivendo un po 'di HTML di base utilizzando le colonne What e TheURL per rendere più facile per gli utenti accedere alle risorse visualizzate nella tabella.

Quindi seleziono le colonne che desidero nell'ordine in cui le desidero.

nicar%

mutare (

Resource = glue :: glue ("{What}")

)%>%

selezionare (Risorsa, Chi, Tag, Tipo, Commenti)

Inizia con una tabella reattiva di base 

Infine, creo una tabella reattiva di base e predefinita.

reattivo (nicar)

E questa tabella è fondamentale. Non esiste ancora una casella di ricerca e la colonna Risorsa mostra il codice HTML effettivo invece di essere visualizzato come HTML

Sharon Machlis,

Nel gruppo di codice successivo, aggiungo una casella di ricerca alla tabella e piccole icone a freccia che mostrano che le colonne sono ordinabili.

reattivo (nicar, ricercabile = TRUE, showSortable = TRUE, showSortIcon = TRUE)

Per dire a Reactable di visualizzare la colonna Risorsa come HTML, utilizzo l'argomento colonne e un elenco in cui colDef imposta gli attributi di una o più colonne. Di seguito, sto impostando html = truela colonna Risorsa in modo che venga visualizzata come HTML e sto anche rendendo ridimensionabile quella colonna.

reattivo (nicar, ricercabile = TRUE, showSortable = TRUE, showSortIcon = TRUE,

colonne = elenco (

Risorsa = colDef (html = TRUE, ridimensionabile = TRUE)

)

)

Per dire a Reactable di non visualizzare la colonna Commenti nella tabella principale, ho impostato colDef(show = FALSE).

reattivo (nicar, ricercabile = TRUE, showSortable = TRUE, showSortIcon = TRUE,

colonne = elenco (

Risorsa = colDef (html = TRUE, ridimensionabile = TRUE),

Commenti = colDef (show = FALSE)

)

)

Fin qui tutto bene.

Sharon Machlis,

Aggiungi codice reattivo per righe espandibili

Il passaggio successivo consiste nell'aggiungere le righe espandibili, e questo è un po 'più complesso:

# Funzione necessaria secondo Greg Lin, creatore di Reactable

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

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

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

}

reattivo (nicar, ricercabile = TRUE, showSortable = TRUE,

colonne = elenco (

Risorsa = colDef (html = TRUE, ridimensionabile = TRUE),

Commenti = colDef (show = FALSE)

),

# se esiste un commento, rendi la riga espandibile

dettagli = funzione (indice) {

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

htmltools :: tagList (

html (nicar $ Commenti [indice])

)

}

}

)

Non ho scritto questa parte da solo; il creatore reattivo Greg Lin lo ha scritto. Onestamente, non capisco cosa stiano facendo ogni riga. Ma funziona! 

Sharon Machlis

Ricorderò questo codice la prossima volta che voglio creare una tabella con righe espandibili? No. Assolutamente no. Ma se creo uno snippet di codice RStudio , non devo ricordarmelo. Saranno sempre solo un paio di battiture di distanza.

Se non hai familiarità con gli snippet di codice RStudio, dai un'occhiata all'episodio Fai di più con R sugli snippet di codice per una spiegazione completa . Ma qui ci sono le basi.  

Crea uno snippet di codice RStudio

Di seguito è riportata un'immagine del codice della tabella che evidenzia le variabili per il frame di dati e i nomi delle colonne, oltre a modificare la definizione della colonna dalla notazione del segno del dollaro alla notazione delle parentesi (che funziona molto meglio negli snippet). Inoltre, molto importante, ho aggiunto un titolo snippet e ho rientrato ogni riga di codice con una scheda iniziale. È un must!

Sharon Machlis,

Quindi ho solo bisogno di cambiare il nome di ogni variabile in una variabile snippet generica : 1 per il frame di dati, 2 per la colonna che voglio visualizzare come HTML e 3 per la colonna della riga espandibile. Si noti la sintassi delle variabili: ${number:variable_name}. Queste variabili mi permetteranno di inserire facilmente i nomi delle variabili effettive in RStudio. 

snippet my_expandable_row

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

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

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

}

reattivo ($ {1: mydf}, ricercabile = TRUE, showSortable = TRUE,

colonne = elenco (

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

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

),

dettagli = funzione (indice) {

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

htmltools :: tagList (

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

)

}

}

)

Puoi copiare e incollare lo snippet di codice sopra nel tuo file di snippet RStudio usando

usethis :: edit_rstudio_snippets ()

per aprire il file di frammenti in RStudio. Assicurati che le virgolette del codice dello snippet siano semplici virgolette e che ogni riga sia rientrata con una tabulazione (non solo spazi; una tabulazione iniziale per ogni riga di codice è obbligatoria).

Ora se digiti il ​​nome dello snippet in un file di script R sorgente di RStudio, dovrebbe espandersi per darti il ​​codice. È quindi possibile digitare il nome della prima variabile, premere tab, digitare il nome della seconda variabile e così via. Guarda il video incorporato in questo articolo per vedere come funziona. E goditi i tuoi tavoli interattivi con righe espandibili!

Per altri suggerimenti R, vai alla pagina Fai di più con R.