【问题标题】:Generating dynamic number of datatables without rerendering在不重新渲染的情况下生成动态数量的数据表
【发布时间】:2016-10-24 18:35:08
【问题描述】:

我想知道处理动态数量的数据表的最佳做法是什么。这是一个玩具示例:

library(shiny)
library(DT)
ui <- shinyUI(fluidPage(
  mainPanel(
    sliderInput("number","Number of tables",1,10,1,1),
    uiOutput("tables")
  )))

server <- shinyServer(function(input, output, session) {

  observe({
    lapply(seq_len(input$number), function(i) {
      output[[paste0("table",i)]] <- DT::renderDataTable(head(mtcars))
    })
  })

  output$tables <- renderUI({
    lapply(seq_len(input$number), function(i) {
      DT::dataTableOutput(paste0("table",i))
    })
  })


})
# Run the application
shinyApp(ui = ui, server = server)

这种方法有点生硬,因为无论何时添加或删除单个数据表,您都必须重新呈现所有数据表。

有没有更好的方法来动态生成输出,不需要在循环中创建所有输出,因此每次发生更改时都重新创建所有输出?

【问题讨论】:

  • 我认为 Shiny 0.14 中的 insertUIremoveUI 会起作用。
  • 谢谢@warmoverflow。

标签: r shiny dt


【解决方案1】:

我是insertUIremoveUI 的作者。当应用于交互式输出时,您似乎在 insertUI 中发现了一个错误。我提交了issue for this in the Shiny repo 并会尽快处理。同时,一种解决方法是在对insertUI() 的调用中使用where = "beforeBegin" 而不是where = "beforeEnd"。有关详细信息,请参阅my answer DT 存储库中提交的原始问题。

【讨论】:

  • 非常感谢您的帮助
【解决方案2】:

[Edit] 答案已更新为 @Bárbara Borges 的解决方法(有关其工作原理的详细信息,请参阅她的答案)

这里是一个例子,但注意它适用于普通表(不刷新),但对于数据表,删除表时没有刷新但添加表时总是刷新。我认为这是由 DT 引起的,但尚未找到真正的原因。我发帖是希望有人可以改进这一点。

library(shiny)
library(DT)

numUI <- 0

ui <- shinyUI(fluidPage(
  mainPanel(
    sliderInput("number","Number of tables",1,10,1,1),
    tags$div(id="tables")
  )))

server <- shinyServer(function(input, output, session) {

  observe({
    if (input$number > numUI) {
      for (num in (numUI+1):input$number) {
        insertUI("#tables", "beforeBegin", DT::dataTableOutput(paste0("table", num)))
        output[[paste0("table",num)]] <- DT::renderDataTable(head(mtcars), server = FALSE)
      }
    }

    if (input$number < numUI) {
      for (num in (input$number+1):numUI) {
        removeUI(paste0("#table", num))
      }
    }

    numUI <<- input$number
  })

})
# Run the application
shinyApp(ui = ui, server = server)

【讨论】:

  • 如果你设置server=FALSE就可以了,但我不知道为什么。
  • 从头开始。它正在重新渲染它只是做得更快
  • @Carl 你怎么知道它是否还在用server=F 重新渲染。我不能在我的电脑上说出来。
  • 选择一些行,然后更改表的数量。它丢失了选定的行
  • @Carl 你是对的。删除表格时,选择仍然存在。
猜你喜欢
  • 2022-07-30
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2019-03-08
  • 1970-01-01
  • 2018-03-27
  • 2020-08-18
相关资源
最近更新 更多