R Shiny:刷新/覆盖actionButton()输出

时间:2018-01-02 03:27:38

标签: r shiny

我正在努力使R Shiny: automatically refreshing a main panel without using a refresh button适应新的最小工作示例:

ui <- fluidPage(

  pageWithSidebar(
    headerPanel("actionButton test"),
    sidebarPanel(
      numericInput("n", "N:", min = 0, max = 100, value = 50),
      br(),
      actionButton("goButton", "Go!"),
      p("Click the button to update the value displayed in the main panel."),
      actionButton("newButton", "New Button"),
      actionButton("newButton2", "Another New Button")
    ),
    mainPanel(
      verbatimTextOutput("nText"),
      textOutput("some_text_description"),
      plotOutput("some_plot")
    )
  )

)


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

  # builds a reactive expression that only invalidates 
  # when the value of input$goButton becomes out of date 
  # (i.e., when the button is pressed)
  ntext <- eventReactive(input$goButton, {
    input$n
  })

  output$nText <- renderText({
    ntext()
  })


  # Prep some text for output
  output$some_text_description <- renderText({ 
    if (input$newButton == 0) {return(NULL)}
    else { 
      "Lorem ipsum dolorom." 
    }
  })

  # Prep some figure for output
  # Simple Bar Plot 
  output$some_plot <- renderPlot({ 
    if (input$newButton2 == 0) {return(NULL)}
    else { 
      counts <- table(mtcars$gear)
      barplot(counts, main="Car Distribution", xlab="Number of Gears")
    }
  })

}



shinyApp(ui = ui, server = server)

在上面的代码中,我有三个actionButton命令,一个产生一个图,一个产生文本输出,另一个产生一个数字(作为逐字文本输出)。当您单击每个按钮时,新输出将与先前生成的输出(从您按下的最后一个按钮)一起显示。

无需手动清除所有内容的刷新按钮,如何让每个actionButton自动覆盖(即擦除)其他人的输出,而不会在主面板中彼此叠加在一起。我的理解是我需要使用observeEventNULLreactiveValues的某种组合,但到目前为止我的尝试都没有成功。

1 个答案:

答案 0 :(得分:2)

您可以使用renderUI()

  output$all <- renderUI({
    global$out
  })

在全局reactiveValue global$out中,您可以存储要显示的ui元素。 (最初它应为空,因此NULL)。

  global <- reactiveValues(out = NULL)

然后听取按钮中的点击并相应地更新global$out

  observeEvent(input$goButton, {
    global$out <- verbatimTextOutput("nText")
  })

  observeEvent(input$newButton, {
    global$out <- textOutput("some_text_description")
  })

  observeEvent(input$newButton2, {
    global$out <- plotOutput("some_plot")
  })

完整的应用程序会显示:

library(shiny)
ui <- fluidPage(

  pageWithSidebar(
    headerPanel("actionButton test"),
    sidebarPanel(
      numericInput("n", "N:", min = 0, max = 100, value = 50),
      br(),
      actionButton("goButton", "Go!"),
      p("Click the button to update the value displayed in the main panel."),
      actionButton("newButton", "New Button"),
      actionButton("newButton2", "Another New Button")
    ),
    mainPanel(
      uiOutput("all")
    )
  )

)


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

  global <- reactiveValues(out = NULL)

  observeEvent(input$goButton, {
    global$out <- verbatimTextOutput("nText")
  })

  observeEvent(input$newButton, {
    global$out <- textOutput("some_text_description")
  })

  observeEvent(input$newButton2, {
    global$out <- plotOutput("some_plot")
  })

  output$all <- renderUI({
    global$out
  })

  output$nText <- renderText({
    input$n
  })

  output$some_text_description <- renderText({ 
      "Lorem ipsum dolorom."
  })

  # Simple Bar Plot 
  output$some_plot <- renderPlot({ 
    counts <- table(mtcars$gear)
    barplot(counts, main="Car Distribution", xlab="Number of Gears")
  })

}



shinyApp(ui = ui, server = server)