R Shiny:不使用刷新按钮自动刷新主面板

时间:2018-01-01 18:41:10

标签: r shiny

我有一个带有多个actionButton命令的Shiny应用程序。当我单独点击每个按钮(例如,绘制图形或渲染表格)时,我希望我的主面板能够使用相应的图形或表格自动更新/刷新。相反,我的Shiny应用程序只是将一个actionButton的输出附加到同一面板中另一个actionButton的上一个输出。

从以前的Stack Overflow帖子中,似乎解决此问题的唯一方法是实现刷新按钮。例如,在以下MWE中:

library(DT)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("amountTable", "Amount Tables", 1:10),
      actionButton("submit1" ,"Submit", icon("refresh"),
                   class = "btn btn-primary"),

      actionButton("refresh1" ,"Refresh", icon("refresh"),
                   class = "btn btn-primary")

    ),
    mainPanel(
      # UI output
      uiOutput("dt")
    )
  )
)

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

  global <- reactiveValues(refresh = FALSE)

  observe({
    if(input$refresh1) isolate(global$refresh <- TRUE)
  })

  observe({
    if(input$submit1) isolate(global$refresh <- FALSE)
  })

  observeEvent(input$submit1, {
    lapply(1:input$amountTable, function(amtTable) {
      output[[paste0('T', amtTable)]] <- DT::renderDataTable({
        iris[1:amtTable, ]
      })
    })
  })

  output$dt <- renderUI({
    if(global$refresh) return()
    tagList(lapply(1:10, function(i) {
      dataTableOutput(paste0('T', i))
    }))
  })

}

shinyApp(ui, server)

来源:https://stackoverflow.com/a/43522607

您需要单击刷新按钮以在显示新输出之前清除先前的输出,否则它们将堆叠在彼此之上。

有没有办法在不明确点击刷新按钮的情况下动态/反应刷新主面板?例如,单击新的actionButton按钮以显示下一个输出并让它同时自动刷新主面板会很不错。请随时提供您自己的MWE,以显示此过程如何工作。

1 个答案:

答案 0 :(得分:1)

代码看起来很熟悉;)

原来你的想法是正确的。基本上你必须触发两次输出。一旦清除面板,一次写入新输出。这就是我在global$dt下面所做的事情。

以下完整应用:

library(DT)
library(shiny)
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      selectInput("amountTable", "Amount Tables", 1:10),
      actionButton("submit1" ,"Submit", icon("refresh"),
                   class = "btn btn-primary")
    ),
    mainPanel(
      uiOutput("dt")
    )
  )
)

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

  global <- reactiveValues(dt = NULL)

  observeEvent(input$submit1, {
    lapply(1:input$amountTable, function(amtTable) {
      output[[paste0('T', amtTable)]] <- DT::renderDataTable({
        iris[1:amtTable, ]
      })
    })
  })

  observeEvent(input$submit1, {
    global$dt <- NULL
    global$dt <- tagList(lapply(1:input$amountTable, function(i) {
      dataTableOutput(paste0('T', i))
    }))
  })

  output$dt <- renderUI({
    global$dt
  })

}

shinyApp(ui, server)