我想添加单击表格单元格后发生的事情的功能(例如打开模态)。因为(假设我的dt具有ID“dt”)input$dt_cell_clicked
保持不变,直到我单击一个新单元格,我无法在重新单击该单元格时执行相同的事件。
我尝试使用javascript手动重置input$dt_cell_clicked
。这有效,但似乎DT中有一个内部更新标记,它注意到我之前单击了单元格,并没有将input$dt_cell_clicked
的值设置为单击的值。有解决方法还是这个错误?
谢谢!
最小例子:
library(shiny)
library(shinyjs)
ui <- fluidPage(
h2("Last clicked:"),
verbatimTextOutput("last_clicked"),
actionButton("reset", "Reset clicked value"),
h2("Datatable:"),
DT::dataTableOutput("dt"),
useShinyjs(),
extendShinyjs(text = paste0("shinyjs.resetDTClick = function() { Shiny.onInputChange('dt_cell_clicked', null); }"))
)
server <- function(input, output) {
# the last clicke value
output$last_clicked <- renderPrint({
str(input$dt_cell_clicked)
})
output$dt <- DT::renderDataTable({
DT::datatable(head(mtcars, 2))
})
observeEvent(input$dt_cell_clicked, {
validate(need(length(input$dt_cell_clicked) > 0, ''))
alert("You clicked something!")
})
observeEvent(input$reset, {
js$resetDTClick()
})
}
shinyApp(ui, server)
答案 0 :(得分:1)
在使用代理(Gregor de Cillia)的提示后,我找到了一个使用绕行的解决方法:最后选择的单元格。观察最后选择的单元格,并在新选择时执行某些操作。我们可以使用DT代理重置选择。
library(shiny)
ui <- fluidPage(
h2("Last clicked:"),
verbatimTextOutput("last_clicked"),
actionButton("reset", "Reset clicked value"),
h2("Datatable:"),
DT::dataTableOutput("dt")
)
server <- function(input, output) {
# the last clicked=selected value
output$last_clicked <- renderPrint({
str(input$dt_rows_selected)
})
output$dt <- DT::renderDataTable({
DT::datatable(head(mtcars, 2), selection = 'single')
})
# do some action after selecting a value
observeEvent(input$dt_rows_selected, {
validate(need(!is.null(input$dt_rows_selected), ''))
print("You clicked something!")
})
myProxy = DT::dataTableProxy('dt')
# reset last selected value using the proxy
observeEvent(input$reset, {
DT::selectRows(myProxy, NULL)
})
}
shinyApp(ui, server)
答案 1 :(得分:0)
这是一个可以正确重置的版本。它使用一个被动值(称为last
),每当按下重置按钮时它被设置为NULL
,并且每当更新此值时都会取input$dt_cell_clicked
的值。
我还使用shinyjs
与dataTableProxy
一起删除了selectRows
的依赖关系
library(shiny)
ui <- fluidPage(
h2("Last clicked:"),
verbatimTextOutput("last_clicked"),
actionButton("reset", "Reset clicked value"),
h2("Datatable:"),
DT::dataTableOutput("dt")
)
server <- function(input, output) {
# the last clicke value
output$last_clicked <- renderPrint({
str(last())
})
output$dt <- DT::renderDataTable({
DT::datatable(head(mtcars, 2))
})
observeEvent(input$dt_cell_clicked, {
validate(need(length(input$dt_cell_clicked) > 0, ''))
print("You clicked something!")
})
myProxy = DT::dataTableProxy('dt')
last = reactiveVal(NULL)
observe({
last(input$dt_cell_clicked)
})
observeEvent(input$reset, {
DT::selectRows(myProxy, NULL)
last(NULL)
output$dt <- DT::renderDataTable({ # EDIT
DT::datatable(head(mtcars, 2)) # EDIT
}) # EDIT
})
}
shinyApp(ui, server)