2014-07-06 13 views
9

Sono nuovo di R-Shiny e la mia domanda potrebbe essere molto semplice. Dopo ore di riflessione e di ricerca, non ho potuto risolvere il problema. Ecco il problema:relativo a un set di dati di input in R Shiny

1) La mia app chiede all'utente di caricare il suo set di dati.

2) Quindi nel file server, ho letto il set di dati e ho fatto alcune analisi e ho riportato i risultati nell'interfaccia utente.

3) La mia interfaccia utente ha 4 uscite diverse.

4) Ho letto il set di dati nella funzione "rendering" di ciascuna uscita. PROBLEMA: facendo così, i dati sono definiti localmente nell'ambito di ciascuna funzione, il che significa che ho bisogno di leggerlo di nuovo per ogni uscita.

5) Questo è molto inefficiente, c'è qualche alternativa? usando reattivo?

6) Di seguito è riportato un codice di esempio che mostra come ho scritto il mio 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 

    }) 

}) 

Come posso solo ottenere i dati di input, una volta e basta usare i dati nei miei funzioni di uscita?

Grazie mille,

risposta

7

è possibile chiamare i dati dal file in una funzione reactive. Si può quindi essere letta per esempio come myData() in altre reactive funzioni:

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

Ciao @jdharrison, grazie mille per la risposta. In realtà l'ho provato, ma ricevo l'errore che "oggetto di tipo" chiusura "non è subsiabile". – Sam

+0

Si noti che più avanti nelle mie funzioni di rendering si fa riferimento a "myData" e si useranno alcune delle colonne dei dati tramite l'operatore $. Ottengo l'errore sopra ogni volta che uso una colonna come myData $ col1. – Sam

+1

Funziona bene per me. Si accederà alla colonna come 'myData() $ col1', tuttavia normalmente farai prima qualcosa come' mydata <- myData() 'prima nella tua funzione reattiva. – jdharrison

Problemi correlati