单击后隐藏文本输入和按钮

Hide text input and button after click

我是 Shiny 的新手。我开发了一个非常简单的应用程序,它可以在单击按钮后修改插入到文本输入中的字符串。结果从一开始就出现在文本输出中。这是我的代码:

# ui.R

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  textInput("caption", "Caption", "abc"),
  actionButton("btn_input", "Enter"),
  verbatimTextOutput("value")
)

# server.R

library(shiny)
library(shinyjs)

server <- function(input, output) {
    output$value <- reactive({
        # toggle(id="caption")
        input$btn_input
        v <- isolate({input$caption})
        if (v == "xxx") {
            value <- paste(v, "a")
        } else {
            value <- paste(v, "b")
        }
        value
    })
}

我希望文本输出仅在单击按钮后出现。 同时我希望标题、文本输入和按钮在单击按钮后消失。

进行此更改的最简单方法是什么?提前致谢。

...
# output$value <- reactive({
output$value <- eventReactive(input$btn_input, {
...

我认为conditionalPanel是最简单的方法:

library(shiny)

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 <- function(input, output) {
  
  Value <- eventReactive(input$btn_input, {
    v <- input$caption
    if (v == "xxx") {
      paste(v, "a")
    } else {
      paste(v, "b")
    }
  })
  
  output$value <- renderPrint({
    Value()
  })
}

shinyApp(ui, server)

如果您想要一个“后退”按钮,正如您在评论中所要求的那样,您可以按以下步骤进行:

library(shiny)

ui <- fluidPage(
  conditionalPanel(
    "output.show_input",
    textInput("caption", "Caption", "abc"),
    actionButton("btn_input", "Enter")
  ),
  conditionalPanel(
    "output.show_output",
    style = "display: none;",
    verbatimTextOutput("value"),
    actionButton("btn_back", "Back")
  )
)


server <- function(input, output) {
  
  ShowInput <- reactiveVal(TRUE)
  output$show_input <- reactive({
    ShowInput() 
  })
  outputOptions(output, "show_input", suspendWhenHidden = FALSE)

  ShowOutput <- reactiveVal(FALSE)
  output$show_output <- reactive({
    ShowOutput() 
  })
  outputOptions(output, "show_output", suspendWhenHidden = FALSE)
  
  observeEvent(input$btn_input, {
    ShowInput(FALSE)
    ShowOutput(TRUE)
  })
  
  observeEvent(input$btn_back, {
    ShowInput(TRUE)
    ShowOutput(FALSE)
  })
  
  Value <- eventReactive(input$btn_input, {
    v <- input$caption
    if (v == "xxx") {
      paste(v, "a")
    } else {
      paste(v, "b")
    }
  })
  
  output$value <- renderPrint({
    Value()
  })
}

shinyApp(ui, server)