Cara membuat jadual dalam R dengan baris yang boleh dikembangkan

Jadual interaktif dengan mencari dan menyusun boleh menjadi kaedah yang baik untuk meneroka data. Dan kadang-kadang, anda mungkin ingin berkongsi data itu dengan orang lain - termasuk data teks sahaja seperti senarai tutorial video Do More With R.

Tetapi apabila data tersebut merangkumi lajur dengan entri yang cukup panjang, lajur itu mungkin tidak sesuai dengan ukuran lebar skrin anda. Ini sangat sukar apabila tidak setiap baris merangkumi lajur yang sangat luas. Sebagai contoh, jadual hasil soal selidik di mana satu bidang adalah "Adakah anda mempunyai komen tambahan?" Tidak semua orang mungkin.

Di situlah meja dengan baris yang boleh dikembangkan dapat berguna. Pada persidangan kewartawanan data NICAR awal tahun ini, saya menghantar borang supaya penceramah (dan peserta lain) dapat menghantar pautan ke pembentangan sesi. Beberapa orang menambah komen tambahan; yang lain tidak. Menunjukkan lajur itu secara lalai akan membuang banyak harta tanah skrin.

Sebaliknya, medan komen itu dipaparkan dalam jadual interaktif sumber NICAR saya hanya jika pengguna mengklik ikon baris pengembangan. Tidak setiap baris dapat dikembangkan dengan ikon yang dapat diklik di sebelah kiri nama Topik kerana tidak setiap baris memiliki data dalam bidang itu, seperti yang anda (semoga) dapat dilihat pada tangkapan layar di bawah.

Sharon Machlis,

Mari lihat bagaimana membuat jadual seperti ini. 

Sekiranya anda ingin mengikuti, pasang dan muatkan pakej yang boleh ditindak balas. Untuk demo ini, anda juga memerlukan pakej rio, gam, htmltools, dan dplyr.

Anda boleh memuat turun data yang akan saya gunakan dalam demo ini dari pautan di bawah. Ini adalah sekumpulan data kecil (15 baris) mengenai sesi R dan Python pada persidangan NICAR tahun ini.

muat turun Lakukan Lebih Banyak Dengan Set Demo R untuk Jadual dengan Baris yang Boleh Diperluas 15 baris maklumat mengenai sesi R dan Python pada persidangan kewartawanan data NICAR 2020 Sharon Machlis

Muatkan tindak balas dan dplyr dalam R

Dalam kod di bawah, saya memuatkan reactable dan dplyr dan kemudian mengimport data saya menggunakan rio::import()

perpustakaan (boleh bertindak balas)

perpustakaan (dplyr)

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

Data mempunyai lajur untuk nama sumber (Apa), pengarang (Siapa), TheURL, Teg, Jenis, dan Komen.

Seterusnya, saya ingin membuat lajur baru yang disebut Sumber dengan pautan yang dapat diklik ke setiap sumber. Saya hanya menulis sedikit HTML asas menggunakan lajur What dan TheURL untuk memudahkan pengguna mendapatkan sumber yang dipaparkan dalam jadual.

Kemudian saya memilih lajur yang saya mahukan mengikut urutan yang saya mahukan.

nicar%

bermutasi (

Sumber = gam :: gam ("{What}")

)%>%

pilih (Sumber, Siapa, Teg, Jenis, Komen)

Mulakan dengan jadual asas yang boleh dikendalikan 

Akhirnya, saya membuat jadual asas yang boleh dikendalikan semula.

boleh bertindak balas (nicar)

Dan jadual ini adalah asas. Belum ada kotak carian dan lajur Sumber menunjukkan kod HTML sebenar dan bukannya dipaparkan sebagai HTML

Sharon Machlis,

Dalam kumpulan kod seterusnya, saya menambahkan kotak carian ke meja dan ikon anak panah kecil yang menunjukkan bahawa lajur dapat disusun.

boleh bertindak balas (nicar, dicari = BENAR, showSortable = BENAR, showSortIcon = BENAR)

Untuk memberitahu boleh bertindak balas untuk menampilkan lajur Sumber sebagai HTML, saya menggunakan argumen lajur dan senarai di mana colDef menetapkan atribut satu atau lebih lajur. Di bawah, saya menetapkan html = trueuntuk lajur Sumber sehingga dipaparkan sebagai HTML, dan saya juga membuat lajur itu boleh diubah saiznya.

boleh bertindak balas (nicar, dicari = BENAR, showSortable = BENAR, showSortIcon = BENAR,

lajur = senarai (

Sumber = colDef (html = BENAR, boleh ubah saiz = BENAR)

)

)

Untuk memberitahu boleh bertindak balas untuk tidak memaparkan ruangan Komen di jadual utama, saya tetapkan colDef(show = FALSE).

boleh bertindak balas (nicar, dicari = BENAR, showSortable = BENAR, showSortIcon = BENAR,

lajur = senarai (

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

Komen = colDef (tunjukkan = SALAH)

)

)

Setakat ini begitu baik.

Sharon Machlis,

Tambahkan kod yang boleh ditindak balas untuk baris yang boleh dikembangkan

Langkah seterusnya adalah menambahkan baris yang boleh dikembangkan, dan itu sedikit lebih rumit:

# Fungsi diperlukan menurut Greg Lin, pencipta reaktif

html <- fungsi (x, sebaris = SALAH) {

bekas <- if (sebaris) htmltools :: span else htmltools :: div

bekas (bahayaSetInnerHTML = senarai ("__ html" = x))

}

boleh bertindak balas (nicar, dicari = BENAR, showSortable = BENAR,

lajur = senarai (

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

Komen = colDef (tunjukkan = SALAH)

),

# jika ada komen, buat baris boleh dikembangkan

perincian = fungsi (indeks) {

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

htmltools :: tagList (

html (nicar $ Komen [indeks])

)

}

}

)

Saya tidak menulis bahagian ini sendiri; pencipta boleh bertindak balas Greg Lin menulisnya. Sejujurnya, saya tidak faham apa yang dilakukan oleh setiap baris. Tetapi ia berjaya! 

Sharon Machlis

Adakah saya akan mengingati kod ini pada masa berikutnya saya ingin membuat jadual dengan baris yang boleh dikembangkan? Tidak. Tidak semestinya. Tetapi jika saya membuat coretan kod RStudio , saya tidak perlu mengingatnya. Selalunya hanya beberapa penekanan kekunci sahaja.

Sekiranya anda sama sekali tidak mengetahui coretan kod RStudio, lihat episod Do More With R pada coretan kod untuk penjelasan lengkap . Tetapi inilah asasnya.  

Buat coretan kod RStudio

Di bawah ini adalah gambar kod jadual saya yang menyoroti pemboleh ubah untuk bingkai data dan nama lajur saya, serta mengubah definisi lajur dari notasi tanda dolar menjadi notasi kurungan (yang berfungsi lebih baik dalam coretan). Juga - sangat penting - Saya menambah tajuk coretan dan menandakan setiap baris kod dengan tab permulaan. Itu mesti!

Sharon Machlis,

Kemudian saya hanya perlu menukar setiap nama pemboleh ubah menjadi pemboleh ubah coretan generik : 1 untuk kerangka data, 2 untuk lajur yang ingin saya paparkan sebagai HTML, dan 3 untuk lajur baris yang dapat dikembangkan. Nota sintaks yang berubah-ubah: ${number:variable_name}. Pemboleh ubah ini akan memudahkan saya mengisi nama pemboleh ubah sebenar di RStudio. 

coretan my_expandable_row

html <- fungsi (x, sebaris = SALAH) {

bekas <- if (sebaris) htmltools :: span else htmltools :: div

bekas (bahayaSetInnerHTML = senarai ("__ html" = x))

}

boleh bertindak balas ($ {1: mydf}, dicari = BENAR, tunjukkanSortable = BENAR,

lajur = senarai (

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

$ {3: expand_col} = colDef (tunjukkan = SALAH)

),

perincian = fungsi (indeks) {

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

htmltools :: tagList (

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

)

}

}

)

Anda boleh menyalin dan menampal kod coretan di atas ke dalam fail coretan RStudio anda sendiri menggunakan

usethis :: edit_rstudio_snippets ()

untuk membuka fail coretan di RStudio. Pastikan petikan kod coretan adalah tanda petik biasa dan setiap baris dilekatkan dengan tab (bukan hanya spasi; tab permulaan untuk setiap baris kod adalah wajib).

Sekarang jika anda menaip nama potongan dalam fail skrip R sumber RStudio, ia akan berkembang untuk memberi anda kod. Anda kemudian boleh menaip nama pemboleh ubah pertama, tekan tab, taipkan nama pemboleh ubah kedua anda, dan sebagainya. Lihat video yang disertakan dalam artikel ini untuk melihat cara kerjanya. Dan nikmati jadual interaktif anda sendiri dengan barisan yang boleh dikembangkan!

Untuk lebih banyak petua R, pergi ke halaman Do More With R.