Строка данных DT не выделяется при использовании настраиваемого обратного вызова в блестящем приложении

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

library(DT)
library(shiny)

runApp(shinyApp(
  ui = fluidPage(DT::dataTableOutput('tab'), verbatimTextOutput('row')),
  server = function(input, output) {
    output$tab = DT::renderDataTable({
      datatable(iris, selection = 'single',
                callback = JS("table.on('click.dt', 'tr',
                                function() {
                                  $(this).toggleClass('selected');
                                  Shiny.onInputChange('row', table.rows('.selected').data().toArray());
                                });")
      )
    })
    output$row = renderText({input$row})
  }
))

person danas.zuokas    schedule 01.04.2016    source источник


Ответы (1)


Почему не было в DT input$..._rows_selected? нравиться

library(shiny)
library(DT)


runApp(shinyApp(
  ui = fluidPage(DT::dataTableOutput('tab'), verbatimTextOutput('row')),
  server = function(input, output) {
    output$tab = DT::renderDataTable({
      datatable(iris, selection = "single"
      )
    })
    output$row = renderText({if(length(input$tab_rows_selected)>0) paste(input$tab_rows_selected,as.character(iris[input$tab_rows_selected,]))})
  }
      ))

Обновлять

например, у вас есть дунамические данные

dt1=reactive({
return(iris[iris$Species %in% c("setosa","versicolor"),])})

Возможна любая другая операция с данными

чем будет ваш код

runApp(shinyApp(
  ui = fluidPage(DT::dataTableOutput('tab'), verbatimTextOutput('row')),
  server = function(input, output) {
    dt1=reactive({
      return(iris[iris$Species %in% c("setosa","versicolor"),])})
    output$tab = DT::renderDataTable({
      datatable(dt1(), selection = "single"
      )
    })
    output$row = renderText({if(length(input$tab_rows_selected)>0) paste(input$tab_rows_selected,as.character(dt1()[input$tab_rows_selected,]))})
  }
      ))

Моя DT версия 0.1.45

Обновление 2

не знаю почему, но я думаю, что $(this).toggleClass('selected'); удалит выбранный класс, который добавлен в стандартный пакет DT (toggleClass использовался дважды, и вы ничего не видите).

пытаться

JS("table.on('click.dt', 'tr',
                              function() {
                                                           Shiny.onInputChange('row', table.rows(this).data().toArray());
                              });")

Или установите selection='none'

person Batanichek    schedule 01.04.2016
comment
iris данные - это просто пример. В реальном приложении datatable генерируется динамически. - person danas.zuokas; 01.04.2016
comment
введите $ tab_rows_selected номер строки возврата из ваших данных, и вы можете все данные строки, если хотите. (собираюсь добавить пример) - person Batanichek; 01.04.2016
comment
В вашем случае вам нужно дважды вызвать функцию dt1, чтобы отобразить таблицу и получить значение. - person danas.zuokas; 01.04.2016
comment
Хорошо, не знал этого. - person danas.zuokas; 01.04.2016