当“ R Shiny”中的动作按钮或滑块更改时,隐藏图

时间:2019-01-27 22:48:28

标签: r shiny

我有一个小的Shiny应用程序,每当按下New data按钮时,该应用程序都会生成一些数据。 Show plot按钮显示隐藏的图形。我希望每当按下New data按钮以建立新的数据集时,图都会自动再次隐藏。额外的好处是,一旦更改滑块,就可以隐藏该图。我不需要的是切换操作。

我尝试调整使用条件面板的this example,但无法成功找出如何在values$showTRUE之间正确更改FALSE

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId = "number",
                  label = "Pick a number",
                  min = 6,
                  max = 12,
                  value = 8),
      actionButton("new_data",
                   "New data"),
      actionButton("show_plot",
                   "Show plot")
    ),
    mainPanel(
      tableOutput("char_table"),
      plotOutput(outputId = "car_plot")

    )
  )
)

server <- function(input, output) {

  t <- eventReactive(input$new_data, {
    r <- input$number
    c <- r - 1
    mat <- matrix(sample(0:1,r*c, replace=TRUE),r,c)
  })

  output$char_table <- renderTable({
    t()
  })

  p <- eventReactive(input$show_plot, {
    plot(cars)
  })
  output$car_plot <- renderPlot({
    p()
  })
}

shinyApp(ui = ui, server = server)

2 个答案:

答案 0 :(得分:1)

您可以使用反应值和if来控制绘图。

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId = "number",
                  label = "Pick a number",
                  min = 6,
                  max = 12,
                  value = 8),
      actionButton("new_data",
                   "New data"),
      actionButton("show_plot",
                   "Show plot")
    ),
    mainPanel(
      tableOutput("char_table"),
      plotOutput(outputId = "car_plot")

    )
  )
)

server <- function(input, output) {
  showPlot <- reactiveVal(FALSE)

  t <- eventReactive(input$new_data, {
    showPlot(FALSE)
    r <- input$number
    c <- r - 1
    mat <- matrix(sample(0:1,r*c, replace=TRUE),r,c)
  })

  output$char_table <- renderTable({
      t()
  })

  observeEvent(input$number, {
    showPlot(FALSE) 
  })

  observeEvent(input$show_plot, {
    showPlot(TRUE) 
  })

  output$car_plot <- renderPlot({
    if (showPlot())
      plot(cars)
  })
}

shinyApp(ui = ui, server = server)

答案 1 :(得分:1)

使用shinyjs的替代解决方案在这些情况下很方便。

library(shiny)
library(shinyjs)

ui <- fluidPage( shinyjs::useShinyjs(),
  sidebarLayout(
    sidebarPanel(
      sliderInput(inputId = "number",
                  label = "Pick a number",
                  min = 6,
                  max = 12,
                  value = 8),
      actionButton("new_data",
                   "New data"),
      actionButton("show_plot",
                   "Show plot")
    ),
    mainPanel(
      tableOutput("char_table"),
      plotOutput(outputId = "car_plot")

    )
  )
)

server <- function(input, output) {

  t <- eventReactive(input$new_data, {
    hide("car_plot")
    r <- input$number
    c <- r - 1
    mat <- matrix(sample(0:1,r*c, replace=TRUE),r,c)
  })

  output$char_table <- renderTable({
    t()
  })

  observeEvent(input$show_plot, {
    show("car_plot")
  })
  output$car_plot <- renderPlot({
    plot(cars)
  })
}

shinyApp(ui = ui, server = server)

enter image description here