Реактивный ввод из 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 при нажатии

Спасибо за помощь. @ Винсент, твое приложение очень классное. Надеюсь добраться туда в конце концов. Я приму ваш ответ.

Ответы на вопрос(1)

Ваш ответ на вопрос