Sam
Sam

Reputation: 4497

dealing with an input dataset in R Shiny

I'm new to R-Shiny and my question might be very simple. After hours of thinking and searching, I couldn't solve the issue. Here is the problem:

1) My app asks user to upload his dataset.

2) Then in the server file, I read the dataset and I did some analyses and I report back the results into the user interface.

3)My user interface has 4 different out puts.

4) I read the dataset in the "render" function of each output. ISSUE: by doing so, the data is locally defined in the scope of each function which means that I need to read it over again for each output.

5) This is very in-efficient, Is there any alternative? using reactive ?

6) Below is a sample code showing how I wrote my server.R:

shinyServer(function(input, output) {

   # Interactive UI's:
   # %Completion

   output$myPlot1 <- renderPlot({
     inFile <- input$file

      if (is.null(inFile)) return(NULL)
      data <- read.csv(inFile$datapath, header = TRUE)

      # I use the data and generate a plot here

   })

   output$myPlot2 <- renderPlot({
     inFile <- input$file

      if (is.null(inFile)) return(NULL)
      data <- read.csv(inFile$datapath, header = TRUE)

      # I use the data and generate a plot here

   })

 })

How can I just get the input data once and just use the data in my output functions ?

Thanks very much,

Upvotes: 9

Views: 10779

Answers (1)

jdharrison
jdharrison

Reputation: 30425

You can call the data from the file in a reactive function. It can then be accessed for example as myData() in other reactive functions:

library(shiny)
write.csv(data.frame(a = 1:10, b = letters[1:10]), 'test.csv')
runApp(list(ui = fluidPage(
  titlePanel("Uploading Files"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv',
                         'text/comma-separated-values,text/plain',
                         '.csv'))
    ),
    mainPanel(
      tableOutput('contents')
    )
  )
)
, server = function(input, output, session){
  myData <- reactive({
    inFile <- input$file1
    if (is.null(inFile)) return(NULL)
    data <- read.csv(inFile$datapath, header = TRUE)
    data
  })
  output$contents <- renderTable({
    myData()
  })

}
)
)

enter image description here

Upvotes: 9

Related Questions