2016-10-18 4 views
0

Ich entwickle eine App (dies ist eine abgespeckte Version), wo der Benutzer eine .csv Datei hochladen und einige automatisierte Berechnungen durchführen kann (in diesem Fall nur ein einfaches lineares Modell zu erhalten der r.squared Wert). Da es eine große Anzahl von .csv Tabellenkalkulationen gibt (jede kann einen eindeutigen Namen haben), habe ich mich gefragt, ob es möglich wäre, alle r.squared Werte in einer einzigen Übersichtstabelle (der zweiten Registerkarte) zu speichern kann dann als eine einzige .csv Datei einmal alle Dateien durch (ich bin bequem gegangen waren mit der Aktionstaste ausgeführt werden, um diesen letzten Teil zu tunPersistente Speicherung der Datenausgabe in R glänzend

ich zwei Workflow-Optionen habe.

  1. Mehrere Dateien (oder ein Ordner kann sofort geladen werden)
  2. Jede Datei wird einzeln geladen

ui.R

library(shiny) 
ui <- fluidPage(
    navbarPage("Menu",inverse=TRUE,fluid=TRUE,collapsible=TRUE,selected = "Data input", 
     tabPanel("Data input", 
        sidebarLayout(
      sidebarPanel(
      fileInput('file1', 'Choose CSV File', 
         accept=c('text/csv', 
           'text/comma-separated-values,text/plain', 
           '.csv')), 
      tags$hr(), 
      checkboxInput('header', 'Header', TRUE), 
      radioButtons('sep', 'Separator', 
          c(Comma=',', 
          Semicolon=';', 
          Tab='\t'), 
          ','), 
      radioButtons('quote', 'Quote', 
          c(None='', 
          'Double Quote'='"', 
          'Single Quote'="'"), 
          '"') 
      ), 
      mainPanel(
      tableOutput('contents') 
      ) 
     )), 


     tabPanel("Summary",fluidRow(
      column(6, 
        tableOutput("summary")))) 

     )) 

server.R

server <- function(input, output) { 
      mydata<-reactive({ 
      inFile <- input$file1 

      if (is.null(inFile)) 
      return(NULL) 

      data<-read.csv(inFile$datapath, header=input$header, sep=input$sep, 
       quote=input$quote) 

      data 
      }) 

      output$contents <- renderTable({ 
      mydata() 
      }) 

      output$summary <- renderTable({ 

      m<-lm(mydata()[,1]~mydata()[,2]) 
      summary(m)$r.squared 

      }) 

      } 


    shinyApp(ui, server) 
+0

Wahrscheinlich möchten Sie eine globale Variable http://shiny.studio.com/articles/scoping.html –

Antwort

0

I reactiveValues für dieses Zeug verwenden würde. Es funktioniert wie eine Liste, ist aber reaktiv, so dass Sie es während der gesamten Sitzung ändern können. Hier ist ein Beispiel, in dem ich R-Quadratwerte speichere, die während der Sitzung berechnet werden.

Es ist im Grunde der Code, den Sie oben gepostet haben. Auf dem Server habe ich ein reactiveValues Objekt storage und ein observeEvent, die nur storage$Rsquared durch die R-Quadrat eingefügt, wann immer mdata() wird neu bewertet.

Dies ist nur ein einfaches Beispiel. Durch Hinzufügen von Bedingungen in observeEvent können Sie es anspruchsvoller machen. Oder vielleicht möchten Sie mehr als nur eine Zahl sammeln, dann würden Sie eine andere Art von Datenstruktur in der reactiveValue setzen.

ui

ui <- fluidPage(
    navbarPage("Menu",inverse=TRUE,fluid=TRUE,collapsible=TRUE,selected = "Data input", 
    tabPanel("Data input", 
     sidebarLayout(
     sidebarPanel(
      fileInput('file1', 'Choose CSV File', accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')), 
      tags$hr(), 
      checkboxInput('header', 'Header', TRUE), 
      radioButtons('sep', 'Separator', c(Comma=',', Semicolon=';', Tab='\t'),','), 
      radioButtons('quote', 'Quote', c(None='', 'Double Quote'='"', 'Single Quote'="'"),'"') 
     ), 
     mainPanel(
      tableOutput('contents') 
     ) 
    ) 
    ), 
    tabPanel("Summary", fluidRow(column(6, tableOutput("summary")))) 
)) 

Server

server <- function(input, output) 
{ 
    storage <- reactiveValues(Rsquared = numeric()) 

    mydata <- reactive({ 
    inFile <- input$file1 
    if(is.null(inFile)) return(NULL) 
    data<-read.csv(inFile$datapath, header = input$header, sep = input$sep, quote = input$quote) 
    data 
    }) 

    output$contents <- renderTable({ 
    mydata() 
    }) 

    observeEvent(mdata(),{ 
    m <- lm(mydata()[,1]~mydata()[,2]) 
    storage$Rsquared <- append(storage$Rsquared, summary(m)$r.squared) 
    }) 

    output$summary <- renderTable(storage$Rsquared) 
} 

Dann könnten Sie einen Download-Funktionalität für den Benutzer hinzufügen alle R squared Werte zu speichern, die er schuf. Die Download-Funktion würde storage$Rsquared verwenden und es zum Beispiel in eine .csv schreiben.