Как да създам таблици в R с разширяеми редове

Интерактивните таблици с търсене и сортиране могат да бъдат добър начин за проучване на данни. И понякога може да искате да споделите тези данни с други хора - включително само текстови данни, като списък с видео уроци „Правете повече с R“.

Но когато тези данни включват колона с доста дълги записи, тази колона може да не се побере добре в таблица с ширината на вашия екран. Това може да бъде особено сложно, когато не всеки ред включва много широката колона. Например, таблица с резултатите от въпросника, където едното поле е „Имате ли допълнителни коментари?“ Не всеки може.

Ето къде може да ви бъде полезна таблица с разширяеми редове. На конференцията по журналистика по данни на NICAR по-рано тази година публикувах формуляр, така че ораторите (и другите присъстващи) да могат да изпращат връзки към презентации на сесии. Някои хора добавиха допълнителни коментари; други не. Показването на тази колона по подразбиране би загубило много екранна недвижима собственост.

Вместо това полето за коментар се показва в интерактивната ми таблица с ресурси на NICAR само ако потребител щракне върху иконата за разширяване на реда. Не всеки ред може да бъде разширен с икона, която може да се кликне вляво от името на темата, тъй като не всеки ред има данни в това поле, както можете (надявам се) да видите на екранната снимка по-долу.

Шарън Маклис,

Нека да видим как да направим таблица като тази. 

Ако искате да продължите, инсталирайте и заредете реактивен пакет. За тази демонстрация ще ви трябва и инсталираните пакети rio, лепило, htmltools и dplyr.

Можете да изтеглите данните, които ще използвам в тази демонстрация, от връзката по-долу. Това е малък (15 реда) набор от данни за R и Python сесии на тазгодишната конференция на NICAR.

изтеглете Do More With R Demo Data Set за таблици с разширяеми редове 15 реда информация за R и Python сесии на 2020 NICAR конференция за журналистика за данни Шарън Маклис

Заредете реактивен и dplyr в R

В кода по-долу зареждам реактивен и dplyr и след това импортирам данните си с помощта rio::import()

библиотека (реагираща)

библиотека (dplyr)

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

Данните имат колони за името на ресурса (Какво), автора (Кой), TheURL, Тагове, Тип и Коментари.

След това искам да създам нова колона, наречена Ресурс, с кликваща връзка към всеки ресурс. Просто пиша малко основен HTML, използвайки колоните What и TheURL, за да улесня потребителите да стигнат до ресурсите, показани в таблицата.

След това избирам колоните, които искам, в реда, в който ги искам.

никар%

мутира (

Ресурс = лепило :: лепило ("{Какво}")

)%>%

изберете (Ресурс, Кой, Тагове, Тип, Коментари)

Започнете с основна реактивна маса 

Накрая създавам основна, по подразбиране реагираща таблица.

реактивен (никар)

И тази таблица е основна. Все още няма поле за търсене и колоната Resource показва действителния HTML код, вместо да се показва като HTML

Шарън Маклис,

В следващата кодова група добавям поле за търсене към таблицата и малки икони със стрелки, показващи, че колоните могат да се сортират.

реактивен (nicar, търсене = TRUE, showSortable = TRUE, showSortIcon = TRUE)

За да кажа на реактивен да покаже колоната Resource като HTML, използвам аргумента колони и списък, където colDef задава атрибутите на една или повече колони. По-долу настройвам html = trueколоната Resource, така че да се показва като HTML, и също така правя колоната да може да се преоразмерява.

реактивен (nicar, търсене = TRUE, showSortable = TRUE, showSortIcon = TRUE,

колони = списък (

Ресурс = colDef (html = TRUE, преоразмеряващ = TRUE)

)

)

За да кажа на реактивните да не показва колоната Коментари в основната таблица, зададох colDef(show = FALSE).

реактивен (nicar, търсене = TRUE, showSortable = TRUE, showSortIcon = TRUE,

колони = списък (

Ресурс = colDef (html = TRUE, преоразмеряващ = TRUE),

Коментари = colDef (шоу = FALSE)

)

)

Дотук добре.

Шарън Маклис,

Добавете реактивен код за разширяеми редове

Следващата стъпка е добавяне на разширяемите редове и това е малко по-сложно:

# Функция, необходима според Грег Лин, създател на реактивен

html <- функция (x, вградена = FALSE) {

контейнер <- if (вграден) htmltools :: span else htmltools :: div

контейнер (опасноSetInnerHTML = списък ("__ html" = x))

}

реактивен (nicar, търсене = TRUE, showSortable = TRUE,

колони = списък (

Ресурс = colDef (html = TRUE, преоразмеряващ = TRUE),

Коментари = colDef (шоу = FALSE)

),

# ако има коментар, направете реда разширяващ се

подробности = функция (индекс) {

if (nicar $ Коментари [индекс]! = "") {

htmltools :: tagList (

html (nicar $ Коментари [индекс])

)

}

}

)

Не съм написал тази част сам; реактивният създател Грег Лин го е написал. Честно казано, не разбирам какво прави всяка линия. Но работи! 

Шарън Маклис

Ще запомня ли този код следващия път, когато искам да направя таблица с разширяеми редове? Не. Определено не. Но ако направя кодов фрагмент на RStudio , не трябва да го помня. Винаги ще останат само няколко натискания на клавиши.

Ако изобщо не сте запознати с кодовите фрагменти на RStudio, разгледайте епизода „Направете повече с R“ на кодови фрагменти за пълно обяснение . Но ето основите.  

Направете RStudio кодов фрагмент

По-долу има изображение на кода на таблицата ми, подчертаващо променливите за моята рамка с данни и имена на колони, както и промяна на дефиницията на колона от нотация на знак долар в нотация на скоби (което работи много по-добре в фрагменти). Също така - много важно - добавих заглавие на фрагмент и отстъпих всеки ред код с начален раздел. Това е задължително!

Шарън Маклис,

Тогава просто трябва да променя името на всяка променлива на обща променлива на фрагмент : 1 за рамката с данни, 2 за колоната, която искам да покажа като HTML, и 3 за колоната с разширяем ред. Имайте предвид променливата синтаксис: ${number:variable_name}. Тези променливи ще ми улеснят да попълвам действителните имена на променливи обратно в RStudio. 

фрагмент my_expandable_row

html <- функция (x, вградена = FALSE) {

контейнер <- if (вграден) htmltools :: span else htmltools :: div

контейнер (опасноSetInnerHTML = списък ("__ html" = x))

}

реактивен ($ {1: mydf}, с възможност за търсене = TRUE, showSortable = TRUE,

колони = списък (

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

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

),

подробности = функция (индекс) {

if ($ {1: mydf} [['$ {3: expand_col}']] [индекс]! = "") {

htmltools :: tagList (

html ($ {1: mydf} [['$ {3: expand_col}']] [индекс])

)

}

}

)

Можете да копирате и поставите кода на фрагмента по-горе във вашия собствен RStudio файл с фрагменти, като използвате

usethis :: edit_rstudio_snippets ()

за да отворите файла с фрагменти в RStudio. Уверете се, че кавичките на кодовия фрагмент са обикновени кавички и че всеки ред е с отстъп с таб (не само интервали; началният раздел за всеки ред код е задължителен).

Сега, ако въведете името на фрагмента в RStudio source R скриптов файл, той трябва да се разшири, за да ви даде кода. След това можете да въведете името на първата променлива, да натиснете раздела, да напишете името на втората си променлива и т.н. Вижте видеото, вградено в тази статия, за да видите как работи това. И се насладете на собствените си интерактивни маси с разширяеми редове!

За повече съвети за R отидете на страницата „Правете повече с R“.