根据条件显示图表

Show a chart based on a condition

我有以下代码,您可以在其中输入一个字符串,单击一个按钮并根据输入的字符串获得结果:

# ui.R

ui <- fluidPage(
    conditionalPanel(
        "input.btn_input === 0",
        textInput("caption", "Caption", "abc"),
        actionButton("btn_input", "Enter")
    ),
    conditionalPanel(
        "input.btn_input !== 0",
        style = "display: none;",
        verbatimTextOutput("value")
    )
)

# server.R

server <- function(input, output) {
    
    Response <- eventReactive(input$btn_input, {
        v <- input$caption
        if (v == "xxx") {
            # Allow to use the chart
        } else {
            "Error"
        }
    })
    
    output$value <- renderPrint({
        Response()
    })
}

现在,我想插入 Shiny 示例中包含的图表,而不是 # Allow to use the chart,即:

ui <- fluidPage(

    titlePanel("Old Faithful Geyser Data"),

    sidebarLayout(
        sidebarPanel(
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30)
        ),

        mainPanel(
           plotOutput("distPlot")
        )
    )
)

server <- function(input, output) {

    output$distPlot <- renderPlot({
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = input$bins + 1)

        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}
 
shinyApp(ui = ui, server = server)

谁能建议我怎么做?我能做的最好的事情就是显示侧边栏面板。提前致谢。

我们可以使用 shinyjs 包来根据条件显示和隐藏元素。

例如,我们可以用div包裹sidebarLayout,给它一个唯一的id参数。这是一个示例代码:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  titlePanel("Old Faithful Geyser Data"),
  #initialize shinyjs
  shinyjs::useShinyjs(),
  textInput("caption", "Caption", "abc"),
  hidden(verbatimTextOutput("value")),
  shinyjs::hidden(div(
    id = "sidebar_part",
    sidebarLayout(
      sidebarPanel(
        sliderInput("bins",
          "Number of bins:",
          min = 1,
          max = 50,
          value = 30
        )
      ),
      mainPanel(
        plotOutput("distPlot")
      )
    )
  ))
)

server <- function(input, output) {

  # condition to show the sidebarLayout
  observeEvent(input$caption,
    {
      if (input$caption == "xxx") {
        shinyjs::hide("caption")
        shinyjs::show("sidebar_part")
        shinyjs::hide("value")
      } else {
        shinyjs::show("value")
        output$value <- renderText({
          "error"
        })
      }
    },
    ignoreInit = TRUE
  )

  output$distPlot <- renderPlot({
    x <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    hist(x, breaks = bins, col = "darkgray", border = "white")
  })
}

shinyApp(ui = ui, server = server)

编辑:

使用 actionButton 并在提供错误答案时隐藏除错误之外的所有内容。

library(shiny)
library(shinyjs)

ui <- fluidPage(
  titlePanel("Old Faithful Geyser Data"),
  # initialize shinyjs
  shinyjs::useShinyjs(),
  div(
    id = "caption_and_send",
    textInput("caption", "Caption", "abc"),
    actionButton("send", "Send")
  ),
  hidden(verbatimTextOutput("value")),
  shinyjs::hidden(div(
    id = "sidebar_part",
    sidebarLayout(
      sidebarPanel(
        sliderInput("bins",
          "Number of bins:",
          min = 1,
          max = 50,
          value = 30
        )
      ),
      mainPanel(
        plotOutput("distPlot")
      )
    )
  ))
)

server <- function(input, output) {

  # condition to show the sidebarLayout
  observeEvent(input$send,
    {
      if (input$caption == "xxx") {
        shinyjs::hide("caption_and_send")
        shinyjs::show("sidebar_part")
      } else {
        shinyjs::hide("caption_and_send")
        shinyjs::show("value")
        output$value <- renderText({
          "error"
        })
      }
    },
    ignoreInit = TRUE
  )

  output$distPlot <- renderPlot({
    x <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = input$bins + 1)

    hist(x, breaks = bins, col = "darkgray", border = "white")
  })
}

shinyApp(ui = ui, server = server)