2014-07-06 13 views
9

Ich bin neu bei R-Shiny und meine Frage könnte sehr einfach sein. Nach stundenlangem Nachdenken und Suchen konnte ich das Problem nicht lösen. Hier ist das Problem:Umgang mit einem Eingabe-Datensatz in R Shiny

1) Meine App fragt Benutzer zum Hochladen seines Datensatzes.

2) Dann in der Server-Datei, las ich den Datensatz und ich habe einige Analysen und ich berichte die Ergebnisse in der Benutzeroberfläche.

3) Meine Benutzeroberfläche hat 4 verschiedene Ausgänge.

4) Ich habe den Datensatz in der "Render" -Funktion jedes Ausgangs gelesen. PROBLEM: Da die Daten im Bereich jeder Funktion lokal definiert sind, muss ich sie für jeden Ausgang erneut lesen.

5) Dies ist sehr ineffizient, gibt es eine Alternative? reaktive verwenden?

6) Unten finden Sie ein Beispielcode zeigt, wie ich meine server.R schrieb:

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 

    }) 

}) 

Wie kann ich nur die Eingangsdaten einmal und verwenden nur die Daten in meine Ausgangsfunktionen?

Vielen Dank,

Antwort

7

Sie die Daten aus der Datei in einer reactive Funktion aufrufen können. Es kann dann als myData() in anderen reactive Funktionen zum Beispiel erreicht werden:

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

+1

Hallo @jdharrison, vielen Dank für Ihre Antwort sehr. Ich habe das tatsächlich versucht, aber ich bekomme den Fehler, dass "Objekt vom Typ 'Schließung' nicht Teilmenge ist". – Sam

+0

Bitte beachten Sie, dass ich später in meinen Renderfunktionen auf "myData" verweisen und einige der Spalten der Daten über den Operator $ verwenden werde. Ich bekomme den Fehler immer dann, wenn ich eine Spalte wie myData $ col1 verwende. – Sam

+1

Funktioniert gut für mich. Auf die Spalte würde als 'myData() $ col1 'zugegriffen werden, aber normalerweise würden Sie zuerst so etwas wie' mydata <- myData() 'zuerst in Ihrer reaktiven Funktion tun. – jdharrison