2016-10-18 9 views
0

Я разрабатываю приложение (это урезанная версия), где пользователь может загрузить файл .csv и выполнить некоторые автоматизированные вычисления (в этом случае просто простая линейная модель для получения значение r.squared). Поскольку будет большое количество таблиц .csv (каждый может иметь уникальное имя), мне было интересно, можно ли сохранить все значения r.squared в одной сводной таблице (вторая вкладка), которая затем могут быть экспортированы в один .csv файл, когда все файлы будут пройдены (я комфортно с помощью кнопки действия, чтобы сделать эту последнюю частьПостоянное хранилище данных в R shiny

у меня есть два варианта технологического процесса:.

  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, которые вычисляются на протяжении всего сеанса.

Это в основном код, который вы разместили выше. На сервере я включил объект reactiveValuesstorage и observeEvent, который просто добавляет storage$Rsquared по квадрату R всякий раз, когда mdata() переоценивается.

Это всего лишь базовый пример. При добавлении условий в observeEvent вы можете сделать его более сложным. Или, может быть, вы хотите собрать больше, чем просто числовое, тогда вы бы поместили еще один вид структуры данных в reactiveValue.

щ

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, например.