R,闪亮设置数据表ID

时间:2018-06-22 15:44:50

标签: r datatable shiny

我已经使用mapply创建了大量数据表,但是,我需要在下一步中访问数据表。如果用户未指定ID,则R为这些表分配随机ID。这是我想做的一个例子:

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), elementId = "DT_Test")
  })

  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({    
      DT::datatable(head(mtcars, 2))      
    })                                    
  })
}

shinyApp(ui, server)

如果我查看html,elementID并没有更改为我想要的,实际上,R发出警告:

Warning in origRenderFunc() :
  Ignoring explicitly provided widget ID "DT_Test"; Shiny doesn't use them

1 个答案:

答案 0 :(得分:0)

即使在通话后,仍然不确定您要做什么。 但是,如果您有一个数据表列表并且想要访问它们,它的工作原理如下:

library(shiny)
library(purrr)

ui <- fluidPage(
  h2("Last clicked:"),
  verbatimTextOutput("last_clicked"),
  h2("elementId values"),
  verbatimTextOutput("elementId_values"),
  actionButton("reset", "Reset clicked value"),
  h2("Datatable:"),
  DT::dataTableOutput("dt")
)

server <- function(input, output) {

  # the last clicke value
  output$last_clicked <- renderPrint({
    str(last())
  })

  table <- DT::datatable(head(mtcars, 2), elementId = "DT_Test")
  table2 <- DT::datatable(tail(mtcars, 1), elementId = "DT_Test2")

  list_of_data_tables <- list(table, table2)
  element_ids <- purrr::map(list_of_data_tables, "elementId")

  output$elementId_values <- renderPrint({
    element_ids
  })

  output$dt <- DT::renderDataTable({
    list_of_data_tables[[which(element_ids == "DT_Test2")]]
  })


  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({    
      DT::datatable(head(mtcars, 2))      
    })                                    
  })
}

shinyApp(ui, server)