R Shiny Datatable: предотвращение отмены выбора уже выбранной строки при повторном нажатии на нее - PullRequest
0 голосов
/ 30 августа 2018

R (версия 3.4.1) Я работаю с пакетом DT (версия 0.4) в блестящем (версия 1.0.5) и мне нужно, чтобы я хотел предотвратить отмена выбора уже выбранной строки, когда пользователь нажимает на нее снова. Например, на изображении ниже, если пользователь снова нажимает на строку 3, оно не должно быть отменено. Однако, если пользователь выбирает новую строку, эта новая строка выбирается, в то время как предыдущая строка отменяется.

Полагаю, мне нужно, чтобы данные полностью игнорировали событие клика в уже выбранной строке.

If user clicks on row 3 again it should not get deselected but if he clicks on a new row then that new row should get selected while deselecting the old one

Я попытался использовать shinyjs::onclick, как показано ниже, но не идеально, так как "отменить выбор и повторный выбор" выбранной строки (синяя подсветка исчезает и появляется снова при повторном нажатии) вместо предотвращение отмены выделения .

library(shiny)
library(DT)
library(shinyjs)

shinyApp(
  ui <- shinyUI(
    fluidPage(
      shinyjs::useShinyjs(),
      DTOutput("test")
    )
  ),  
  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = 'single')
    })    
    shinyjs::onclick("test",
               selectRows(dataTableProxy("test"), selected = input$test_rows_selected)
             )    
  })
)

Мне было интересно, есть ли простой способ сделать это. Спасибо!

1 Ответ

0 голосов
/ 30 августа 2018

Это только частичное решение (см. edit ниже для полностью рабочего решения) . Работает только при двойном нажатии на строку. При третьем щелчке строка отменяется, я не знаю почему. Может быть, эксперт в datatables может помочь.

library(shiny)
library(DT)

shinyApp(
  ui <- shinyUI(
    fluidPage(
      DTOutput("test")
    )
  ),  
  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = list(mode="single", target="row"), 
                extensions = c("Select"), options = list(select=TRUE),
                callback = JS("
table.on('user-select', 
function (e, dt, type, cell, originalEvent) {
  if ($(cell.node()).parent().hasClass('selected')) {
    e.preventDefault();
  }
});"))
    })    
  })
)

EDIT

Я нашел решение (я не совсем понимаю).

  server <- shinyServer(function(input, output, session) {

    output$test <- renderDT({
      datatable(head(iris), selection = list(mode="single", target="row", info=FALSE), 
                extensions = c("Select"), options = list(select=TRUE),
                callback = JS("
  table.on('user-select', 
    function (e, dt, type, cell, originalEvent) {
      if ($(cell.node()).parent().hasClass('selected') || e.result === undefined) {
        e.preventDefault();
        $(cell.node()).parent().addClass('selected')
        return false;
      }
    });")
      )
    })    
  })
...