Home > Software engineering >  Store text input as variable in R shiny
Store text input as variable in R shiny

Time:04-06

I want to take a user's input and store it as a variable that will be used in a plotting function. My code:

ui <- fluidPage(
 mainPanel(
           plotlyOutput("plot", width = '100%'),
           br(),
           textAreaInput("list", "Input List", ""),
           actionButton("submit", "Submit", icon = icon("refresh"), style="float:right")
))
server <- function(input, output, session) {
my_text <<- renderText({
    req(input$submit)
    return(isolate(input$list))
    my_text ->> subv
  })
bindEvent(my_text,
output$plot <- renderPlotly({
#my very long plot code goes here which takes subv as input. This part has been tested outside of shiny and I know works.  
}

I am trying to store the text in the subv variable as it will dictate what the renderPlotly will generate. When I hit submit nothing happens and the variable is only created after the session ends. The newly created subv variable in my environment does not show the text that was inputted but lists subv as an empty function i.e. subv function(...)

CodePudding user response:

Below you can find a working prototype of what you would like to achieve with some information on what the issues were

First, we need to have a textOutput where our text will be shown. I understand this may not be necessary for the actual use case but it is important for this answer's demonstration purposes.

Next, we should not need to set variables to global via <<- or ->>. This is generally not good practice. Instead, we should store our result in a reactive. See also reactiveVals (but this is harder to follow when the app gets complex).

Since we need to only get the value when we click submit, we should use an event bind to only run when we click submit. This is essentially similar to eventReactive.

Finally, we can use bindCache to cache our result on the input list.

ui <- fluidPage(
  mainPanel(
    plotlyOutput("plot", width = '100%'),
    br(),
    textAreaInput("list", "Input List", ""),
    actionButton("submit", "Submit", icon = icon("refresh"), 
                 style="float:right"),
    textOutput("hello_out")
  ))

server <- function(input, output, session) {
  my_text <- reactive({
    input$list 
    
  }) %>% 
    shiny::bindCache(input$list
                     ) %>% 
    shiny::bindEvent(input$submit)
  output$hello_out  <- renderText({
    my_text()
  })
}

shinyApp(ui, server)
  • Related