Home > Software engineering >  How to create a Shiny-app that selects from multiple dfs, edits one and downloads edited data
How to create a Shiny-app that selects from multiple dfs, edits one and downloads edited data

Time:01-05

I try to create a shiny app in which one can choose from different dfs. Then one can edit values in the table. At last I would like to download the edited table.

Each step for itself , edit and download, select and download is no problem. All three together: great despair.

I don't seem to understand how Shiny updates the reactive values and how you can cut it off with isolate.

library(shiny)
library(DT)


ui <- fluidPage(
  
  # App title ----
  titlePanel("Downloading Data"),
  
  # Sidebar layout with input and output definitions ----
  sidebarLayout(
    
    # Sidebar panel for inputs ----
    sidebarPanel(
      
      # Input: Choose dataset ----
      selectInput("dataset", "Choose a dataset:",
                  choices = c("rock", "pressure", "cars"), multiple=T),
      actionButton(inputId   = "goButton",
                   label     = "Run Report"),
      
      # downloadbutton
      downloadButton("downloadData", "Download")
      
    ),
    
    # Main panel for displaying outputs ----
    mainPanel(
      DTOutput("x1")
    )
  )
)

#df <- cars #if this is taken instead of the first "eventReactive" it works

server <- function(input, output) {
   eventReactive({
    
    # Take a dependency on input$goButton
     input$goButton

    # Use isolate() to avoid dependency on input$obs
     df <-  isolate(input$dataset)
  })

  
  #render the editable DT
  
  output[["x1"]] <- renderDT({
    datatable(
      df,
      selection = "single", 
      editable = TRUE
    )
  })
  
  
  
  # Creating a DF with the edited info
  
  aniRoi2 <- reactiveVal(df)
  
  #Creating proxy
  
  proxy <- dataTableProxy("x1")
  
  #storing edited df in proxy
  
  observeEvent(input[["x1_cell_edit"]], { 
    info <- input[["x1_cell_edit"]]
    newAniroi2 <- 
      editData(aniRoi2(), info, proxy, rownames = TRUE, resetPaging = FALSE)
    aniRoi2(newAniroi2)
    saveRDS(newAniroi2, "data_entry_form.rds") # save rds
  })
  
  
  
  #download the proxy
  
  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(aniRoi2(), file)
    }
  )
  
  
}

shinyApp(ui, server)

Here I try to select a dataset, that only gets loaded by press of a button. Then it should behave like a normal data.frame or tibble.

If I take out the possibilty of selection of dataframes and call between "ui" and "server" "df <- cars" then it works as intended.

As of now I get the error message: Listening on enter image description here

  • Related