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