闪亮的renderDataTable table_cell_clicked

时间:2017-11-18 22:02:06

标签: r shiny dt

我正在尝试使用Shiny创建一个表,用户可以在其中单击一行以查看有关该行的更多信息。我以为我明白了怎么做(见附件代码)。

但是,现在只要用户点击" getQueue"动作按钮,observeEvent(输入$ fileList_cell_clicked,{})似乎被调用。为什么在用户甚至有机会点击一行之前调用它?是否在生成表时调用它?有没有办法解决?

我需要替换"输出$ devel< - renderText(" cell_clicked_called")"如果没有要引用的实际单元格,代码将会出现各种错误。

感谢您的任何建议!

ui <- fluidPage(
   actionButton("getQueue", "Get list of queued files"),
   verbatimTextOutput("devel"),
   DT::dataTableOutput("fileList")     
)

shinyServer <- function(input, output) {
   observeEvent(input$getQueue, {
   #get list of excel files
   toTable <<- data.frame("queueFiles" = list.files("queue/", pattern = "*.xlsx")) #need to catch if there are no files in queue
   output$fileList <- DT::renderDataTable({
     toTable
   }, selection = 'single') #, selection = list(mode = 'single', selected = as.character(1))
   })
   observeEvent(input$fileList_cell_clicked, {
     output$devel <- renderText("cell_clicked_called")
   })}

shinyApp(ui = ui, server = shinyServer)

minimal error code

2 个答案:

答案 0 :(得分:2)

DTinput$tableId_cell_clicked初始化为空列表,导致observeEvent触发,因为observeEvent默认情况下仅忽略NULL个值。通过插入req(length(input$tableId_cell_clicked) > 0)等内容,可以在此列表为空时停止反应式表达式。

以下是您的示例的略微修改版本,用于演示此内容。

library(shiny)

ui <- fluidPage(
  actionButton("getQueue", "Get list of queued files"),
  verbatimTextOutput("devel"),
  DT::dataTableOutput("fileList")     
)

shinyServer <- function(input, output) {

  tbl <- eventReactive(input$getQueue, {
    mtcars
  })

  output$fileList <- DT::renderDataTable({
    tbl()
  }, selection = 'single')

  output$devel <- renderPrint({
    req(length(input$fileList_cell_clicked) > 0)
    input$fileList_cell_clicked
  })
}

shinyApp(ui = ui, server = shinyServer)

答案 1 :(得分:0)

您可以使用icon生成箭头,并使用selection的{​​{1}}参数使其变为可选择/可点击:

DT

enter image description here