【问题标题】:R Shiny: automatically refreshing a main panel without using a refresh buttonR Shiny:自动刷新主面板而不使用刷新按钮
【发布时间】:2018-01-01 18:41:09
【问题描述】:

我有一个带有多个 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,以展示此过程如何工作。

【问题讨论】:

    标签: r shiny


    【解决方案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)
    

    【讨论】:

    • 好的哇,我向您发送了 LinkedIn 联系请求以结交朋友 :) 感谢您的帮助。
    • 顺便说一句,我发布了另一个类似的,如果你有兴趣:stackoverflow.com/questions/48055272/…
    • 原来是你 :) 感谢您的请求!如果您喜欢答案,请随时投票。我看了另一个问题并发布了答案。我不知何故发现renderUI() 更有用。因此,有趣的是,尽管问题非常相似,但答案并不完全一致。或许您也可以使用renderUI() 来回答其他两个问题。无论如何,我希望它有所帮助;)
    猜你喜欢
    • 2011-12-29
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多