Реактивный ввод из renderDataTable
ОБНОВЛЕНИЕ (18 декабря 2015 г.) Самый лучший способ решить эту проблему - здесь:Получить выбранную строку из таблицы данных в блестящем приложении
======================
Я пытаюсь повторно отобразить набор данных, используя выбор строки, предоставленный пользователем. В качестве игрушечного примера
ui.R
library(shiny)
shinyUI(pageWithSidebar(
headerPanel('Examples of DataTables'),
sidebarPanel(
checkboxGroupInput('show_vars', 'Columns to show:', names(mtcars),
selected = names(mtcars))
),
mainPanel(
dataTableOutput("mytable")
)
)
)
server.R
library(shiny)
shinyServer(function(input, output) {
# sorted columns are colored now because CSS are attached to them
output$mytable = renderDataTable({
addRadioButtons <- paste0('<input type="radio" name="row', 1:nrow(mtcars), '" value="', 1:nrow(mtcars), '">',"")
#Display table with radio buttons
cbind(Pick=addRadioButtons, mtcars[, input$show_vars, drop=FALSE])
}, options = list(bSortClasses = TRUE, aLengthMenu = c(5, 25, 50), iDisplayLength = 25))
})
Я хотел бы использовать переключатель, чтобы получить номер строки (скажем, строку 4 на изображении выше) от пользователя, используя какое-то реактивное выражение, скажемrowSelect()
и затем динамически повторно отображать таблицу после некоторой операции над набором данных, например,
mtcars[mtcars[,1] > mtcars[rowSelect(),1], input$show_vars, drop=FALSE]
который будет отбрасывать определенные строки динамически каждый раз, когда пользователь выбирает строку.
ОБНОВЛЕНИЕ (7 февраля-14)
Включая изменения, предложенные @Julien, и внедряя метод, предложенный @Vincent,server.R будет выглядеть так:
library(shiny)
shinyServer(function(input, output) {
#reactive row-selection
rowSelect <- reactive({
if(is.null(input[["row"]])) 1 #initialize
else as.numeric(input[["row"]])})
# User-selected sorting of dataset
output$mytable = renderDataTable({
addRadioButtons <- paste0('<input type="radio" name="row" value="', 1:nrow(mtcars), '">')
cbind(Pick=addRadioButtons, mtcars[order(mtcars[,1] - rnorm(nrow(mtcars), mtcars[rowSelect(),1])), input$show_vars, drop=FALSE])
}, options = list(bSortClasses = TRUE, aLengthMenu = c(5, 10, 20), iDisplayLength = 10))
})
Как и предполагал @agstudy, было важно сохранить количество строк в таблице данных таким же, как и раньше (без подмножества), поэтому странная операция сортировки вышеorder(mtcars[,1] - rnorm(nrow(mtcars), mtcars[rowSelect(),1]))
.
ОБНОВЛЕНИЕ 2 (7 февраля-14)
Во всяком случае, это упражнение показывает недостаток в моем примере. Мое первоначальное намерение состояло в том, чтобы использовать отдельную матрицу ковариации / подобия, чтобы получить порядок сортировки для отображения данных на основе выбранной пользователем строки. Поскольку матрица и таблица были бы очень большими, не имело смысла включать их в качестве раскрывающегося списка ввода или любого другого метода ввода радиокнопок на боковой панели. Это должно было исходить из пользовательского выбора после отображения всей таблицы данных.
Для этого просто заменитеvalue
в радиопереключателе с уникальным идентификатором строки. В server.R, используяrowSelect()
выражение (data
это матрица подобия иmeta
отображается ли дата,ID
является уникальным идентификатором строки, совместно используемымdata
а такжеmeta
):
addRadioButtons <- paste0('<input type="radio" name="row" value=', meta[order(data[rowSelect(),]),"ID"], '>')
cbind(Pick=addRadioButtons, meta[order(data[rowSelect(),]),input$show_vars])
Это продолжало бы прибегать к данным на основе выбранной пользователем строки при выборе порядка на основе матрицы сходства через уникальный идентификатор строки. Надеюсь, это кому-нибудь поможет.
Но если я используюrowSelect
В случае реактивного выражения выбор строки на основе отсортированного набора данных не даст мне правильного выбора строки для матрицы подобия (порядок изменился бы для набора данных, но не для матрицы - проблема рекурсии). Это означает, что мне нужно собрать что-то кроме радиовхода с номером строки - что-то более похожее на идентификационный идентификатор строки (который будет соответствовать как для таблицы - одного из столбцов - так и для матрицы), используя форму отправка клика - в соответствии с этим:Выделение всего текста в текстовом вводе HTML при нажатии
Спасибо за помощь. @ Винсент, твое приложение очень классное. Надеюсь добраться туда в конце концов. Я приму ваш ответ.