R (версия 3.4.1) Я работаю с пакетом DT (версия 0.4) в блестящем (версия 1.0.5), и мне нужно, чтобы я хотел предотвратить отмена выбора уже выбранной строки, когда пользователь нажимает на нее снова. Например, на изображении ниже, если пользователь снова нажимает на строку 3, оно не должно быть отменено. Однако, если пользователь выбирает новую строку, эта новая строка выбирается, в то время как предыдущая строка отменяется.
Я думаю, что мне нужно, чтобы datatable полностью игнорировал событие click в уже выбранной строке.
Я попытался использовать 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)
)
})
)
Мне было интересно, есть ли простой способ сделать это. Спасибо!
Это лишь частичное решение (см. Приведенное ниже изменение для полностью работающего решения). Он работает только при двойном щелчке по строке. При третьем щелчке строка не выбрана, я не знаю почему. Может быть, может помочь специалист в 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;
}
});")
)
})
})
shinjs::onclick()
), то есть сначала shinjs::onclick()
выбор, а затем повторно выбирает строку, по которой щелкнули. Я что-то пропустил? Я думаю, что мне нужно, чтобы datatable полностью игнорировал событие click в уже выбранной строке. Надеюсь, что это имеет смысл. Спасибо!