简体   繁体   中英

How to save input to variable after button click in Shiny?

i'm new in shiny, but i try to write a simple app. It will connect to DB, download DF and print it on site. And i got this. Now I want to pick range to save as csv a part of that DF.

So I have to input labels: Start and Stop, and Action Button.

I tried to find information how to implement that functionality, and i didn't. I found some info about observe function, but it's totaly not working in my example. When I do it as in official doc, after button click noting is happend.

My code:

ui <- fluidPage(
  titlePanel("Skrypt"),
  
  DT::dataTableOutput("table"),
  
  numericInput("Start", "Start", 0),
  verbatimTextOutput("v1"),
  
  numericInput("Stop", "Stop", length(a)),
  verbatimTextOutput("v"),
  
  actionButton("button", "Generate For Range")

)
  
server <-  function(input, output) {
  
  
  # Filter data based on selections
  output$table <- DT::renderDataTable(DT::datatable({
    data <- myDat}))
  
  
}



shinyApp(ui, server)

And only what I tried to do is save Start and Stop as a variables after click button to use it in function to generate_csv(df, start_v, stop_v) as args.

Can someone explain me how to do that in simple way?

One solution uses eventReactive . It creates a calculated value that only updates in response to an event. In this case, the click on your button. That provides a data frame you can use in renderDataTable . Any code to filter data frame moves to the eventReactive named df .

myDat <- data.frame(A = 1:3, B = LETTERS[1:3]) # dummy data for testing

ui <- fluidPage(
  titlePanel("Skrypt"),
  
  DT::dataTableOutput("table"),
  
  numericInput("Start", "Start", 1),
  verbatimTextOutput("v1"),
  
  numericInput("Stop", "Stop", 2),
  verbatimTextOutput("v"),
  
  actionButton("button", "Generate For Range")
  
)

server <-  function(input, output) {
  df <- eventReactive(input$button, {
    
    # Test if filter is valid
    if (input$Start >= input$Stop) stop("Start cannot be larger or equal than stop")
    if (input$Start < min(myDat$A)) stop("Start cannot be less than smallest value")
    if (input$Stop > max(myDat$A)) stop("Stop cannot be larger than largest value")
    
    myDat[input$Start:input$Stop,] # use any filter you deem necessary
  })
  
  
  # Filter data based on selections
  output$table <- DT::renderDataTable({
    d <- DT::datatable(
      data <- df()
    )
  })
  
  
}


shinyApp(ui, server)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM