Реактивный вход от renderDataTable

ОБНОВЛЕНИЕ (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))

})

Hypothetical Reactive Input from DataTable

Я хотел бы использовать радиокнопку для сбора номера строки (скажем, строки 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, ваше приложение очень круто. Надеюсь туда добраться в конце концов. Я приму свой ответ.

Ответ 1

Не ответ, а длинный комментарий: я думаю, вы могли бы это сделать, но это было бы немного беспорядочно. Как только некоторые выбирают переключатель и подмножество данных, как вы возвращаетесь к показу всех данных? Будет ли это применяться только к первому столбцу? Собираетесь ли вы воссоздать все переключатели, когда у данных меньше строк? renderDataTable будет (в какой-то момент) иметь возможность включить что-то вроде ' > 20' в полях ниже каждого столбца. Тем временем вам может быть лучше попытаться подмножить данные с помощью textInput. В качестве примера см. Data > View в этом приложении. Если это не то, что вы ищете, позвольте мне (нам) знать, чего вы пытаетесь достичь.