ОБНОВЛЕНИЕ (18-Дек-2015) Самый лучший пример для этой проблемы - Получить выбранную строку из DataTable в блестящем приложении
======================
Я пытаюсь повторно отобразить набор данных, используя выбор строки, предоставленный пользователем. В качестве примера игрушек
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-feb-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, важно было сохранить количество строк в datatable так же, как и раньше (не подмножество), следовательно, операция weird сортировки выше order(mtcars[,1] - rnorm(nrow(mtcars), mtcars[rowSelect(),1]))
.
ОБНОВЛЕНИЕ 2 (7-feb-14)
Во всяком случае, это упражнение обнаруживает недостаток в моем примере. Мое первоначальное намерение состояло в том, чтобы использовать отдельную матрицу ковариации/подобия, чтобы получить порядок сортировки для отображаемого datatable на основе выбранной пользователем строки, Поскольку матрица и таблица были бы очень большими, было бы бессмысленно включать их в раскрывающийся список входных данных или любой другой метод ввода радиообъектов в боковой панели. Это должно было произойти из пользовательского выбора после отображения целого datatable.
Для этого просто замените value
в радиоблоке уникальным идентификатором строки. В server.R, используя выражение rowSelect()
(data
- это матрица подобия, а meta
- отображаемый datatable, 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
, то выбор строки на основе отсортированного datatable не даст мне правильный выбор строки для матрицы подобия (порядок изменился бы для набора данных но не для матрицы - проблема рекурсии). Это означает, что мне нужно будет собрать что-то другое, кроме радиоввода номера строки, что больше похоже на идентификатор идентификационной строки (который будет соответствовать как таблице - одному из столбцов, так и матрице), используя форму или представление клика - в соответствии с этим: Выбор всего текста в текстовом тексте HTML при нажатии
Спасибо за помощь. @Vincent, ваше приложение очень круто. Надеюсь туда добраться в конце концов. Я приму свой ответ.