R Shiny Datatable: предотвращение отмены выбора уже выбранной строки при повторном нажатии на нее

1

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

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

Изображение 174551

Я попытался использовать shinyjs::onclick как показано ниже, но это не идеально, поскольку кажется, что он " 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)
             )    
  })
)

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

  • 0
    Шри, я отредактировал свой первый ответ, чтобы обеспечить рабочее решение. Скажи мне, если это работает для тебя.
Теги:
datatables
shiny
dt

1 ответ

0

Это лишь частичное решение (см. Приведенное ниже изменение для полностью работающего решения). Он работает только при двойном щелчке по строке. При третьем щелчке строка не выбрана, я не знаю почему. Может быть, может помочь специалист в 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();
  }
});"))
    })    
  })
)

РЕДАКТИРОВАТЬ

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

  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;
      }
    });")
      )
    })    
  })
  • 0
    Это решение, кажется, делает то же самое, что и мое (используя shinjs::onclick() ), то есть сначала shinjs::onclick() выбор, а затем повторно выбирает строку, по которой щелкнули. Я что-то пропустил? Я думаю, что мне нужно, чтобы datatable полностью игнорировал событие click в уже выбранной строке. Надеюсь, что это имеет смысл. Спасибо!
  • 0
    @Shree Я не уверен, что строка отменяется при первом нажатии. Но похоже, что это происходит при следующем нажатии. Но я совсем не уверен.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню