2016-10-18 95 views
0

我正在開發的應用程序(這是一個精簡版),其中用戶能夠上傳.csv文件並執行一些自動計算(在這種情況下只是一個簡單的線性模型,以獲得值爲r.squared)。由於將有大量的.csv電子表格通過去(每個都可以有一個唯一的名字),我不知道這是否有可能將所有r.squared值存儲在一個單一的彙總表(第二個選項卡),其然後可以導出爲一個單一的.csv文件一旦所有的文件已經通過了(我很舒服的操作按鈕做最後一部分數據輸出中的R有光澤的持久性存儲

我有兩個工作流程選項:

  1. 多個文件(或文件夾可以一次)
  2. 加載每個文件都單獨加載

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

你可能需要一個全局變量http://shiny.rstudio.com/articles/scoping.html –

回答

0

我會用reactiveValues這個東西。 它像列表一樣工作,但是是反應性的,因此您可以在整個會話中更改它。 下面是一個例子,我用它來存儲在整個會話中計算的R平方值。

它基本上是你上面貼的代碼。 在服務器中,我包含了一個reactiveValues對象storage和一個observeEvent,只要mdata()被重新評估,它就會按R平方加上storage$Rsquared

這只是一個基本的例子。 通過在observeEvent中添加條件,可以使其更加複雜。 或者,也許你想收集的不僅僅是一個數字越多,那麼你乾脆把另一種數據結構中reactiveValue

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 <- 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) 
} 

然後,您可以爲用戶添加一個下載功能來保存所有的R平方,他創造的價值。 下載功能將使用storage$Rsquared並將其寫入.csv中。