Получить выделенную строку из DataTable в блестящем приложении

Я хочу изменить это приложение:

https://demo.shinyapps.io/029-row-selection/

так что только одна строка может быть выбрана за раз, и поэтому я могу получить элемент в первом столбце выбранной строки для построения данных. Кто-нибудь знает, как это сделать?

Ответ 1

UPDATE: теперь вы можете получить доступ к выбранным строкам с помощью input$tableId_rows_selected в server.R. Подробнее см. здесь.

Чтобы выбрать уникальную строку, вы можете изменить функцию обратного вызова вашего примера на это:

callback = "function(table) {
      table.on('click.dt', 'tr', function() {
            table.$('tr.selected').removeClass('selected');
            $(this).toggleClass('selected');            
        Shiny.onInputChange('rows',
                            table.rows('.selected').data()[0][0]);
      });
    }"

Когда вы нажимаете на строку, она в основном удаляет все выбранные строки (они имеют класс .selected) и выбирает строку, на которую вы нажали.

Я также изменил код в функции Shiny.onInputChange, чтобы он возвращал число в первом столбце.

Ответ 2

Метод R, который отображает DataTable, имеет параметр, который определяет режим выделения. Например:

output$table1 <-
  DT::renderDataTable(dataSet,
                      selection = 'single')

Возможные значения: ('multiple' - значение по умолчанию):

  • ни один
  • одиночный
  • множественным

Для получения дополнительной информации вы можете увидеть: http://rstudio.github.io/DT/shiny.html

EDIT 04/14/2016

В настройке я использую работу с одним режимом выбора, имеет проблемы.

Вот какая версия я использую:

> DT:::DataTablesVersion
[1] "1.10.7"
> packageVersion("DT")
[1] ‘0.1’

Проблема, с которой я столкнулся, заключается в том, что визуально у вас есть выбор одной строки, но когда вы делаете:

observeEvent(input$table1_rows_selected, {
  str(input$table1_rows_selected)
})

Вы получите список со всеми строками, которые были выбраны, но не были явно отменены. Другими словами, выбор новой строки автоматически не отменяет предыдущую строку во внутренней логике Datatables. Это может быть также связано с оболочкой DT, не уверен.

Вот почему в качестве обходного пути мы используем JS для этого:

$(document).on('click', '#table1 table tr', function() {
    var selectedRowIds = $('#table1 .dataTables_scrollBody table.dataTable').DataTable().rows('.selected')[0];

    var selectedId = "";
    if (selectedRowIds.length === 1) {
        selectedId = $(this).children('td:eq(0)').text();
    } else {
      $('#table1 tbody tr').removeClass('selected');
    }
    Shiny.onInputChange("table1_selected_id", selectedId);
});

Как только вы это сделаете, вы сможете:

observeEvent(input$table1_selected_id, {
  str(input$table1_selected_id)
})

Теперь это по крайней мере отправляет правильные данные на ваш сервер. R-код. К сожалению, у вас все еще будет проблема с таблицей, потому что внутри она отслеживает, какие строки были выбраны, и если вы переключаете страницы, это приведет к неправильному выбору. Но по крайней мере это чисто визуальный дефект, и ваш код будет иметь возможность нормально функционировать. Таким образом, это решение действительно требует больше работы.

Ответ 3

Это не является прямым решением для примера, который вы опубликовали, но дает ответ на другой пример.

Существует загружаемый пример блестящего приложения, приведенный и обсуждаемый в следующей ссылке, нажмите здесь! для выбора одной строки в таблице с использованием параметра класса.

Ответ 4

Нижеприведенный код отображает фрейм данных в формате таблицы DT. Пользователи смогут выбрать одну строку. Выбранная строка извлекается и отображается. вы можете написать свою функцию графика в блоке графика на сервере.

Надеюсь, это поможет!

         # Server.R
         shinyServer(function(input, output,session) {




          output$sampletable <- DT::renderDataTable({
          sampletable
          }, server = TRUE,selection = 'single')  

          output$selectedrow <- DT::renderDataTable({

          selectedrowindex <<-     input$sampletable_rows_selected[length(input$sampletable_rows_selected)]
         selectedrowindex <<- as.numeric(selectedrowindex)
         selectedrow <- (sampletable[selectedrowindex,])
         selectedrow



           })

          output$plots <- renderPlot({

          variable <- sampletable[selectedrowindex,1]
          #write your plot function


              })


          })

          #ui.R 
          shinyUI(navbarPage( "Single Row Selection",



                tabPanel("Row selection example",
                         sidebarLayout(sidebarPanel("Parameters"),
                             mainPanel(
                               DT::dataTableOutput("selectedrow"),   
                             DT::dataTableOutput("sampletable")

                           ))

                      )

                      ))

         # global.R 

        library(DT)
        library(shiny)
        selectedrowindex = 0