'Hide text input and button after click
I am new with Shiny. I have developed a very simple app that modifies a string inserted in a text input after the click of a button. The result appears in a text output present from the beginning. This is my code:
# 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
})
}
I would like the text output to appear only after clicking the button. At the same time I would like the caption, the text input and the button to disappear after clicking the button.
What is the easiest way to make this change? Thanks in advance.
Solution 1:[1]
I think conditionalPanel is the easiest way:
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)
If you want a "Back" button, as asked in your comment, you can proceed as follows:
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)
Solution 2:[2]
...
# output$value <- reactive({
output$value <- eventReactive(input$btn_input, {
...
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Jeff |
