Постоянное хранение данных в R блестящем

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

У меня есть два варианта рабочего процесса:

  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)

1 ответ

Я хотел бы использовать reactiveValues для этого материала. Он работает как список, но реагирует, так что вы можете изменить его на протяжении всего сеанса. Вот пример, где я использую его для хранения значений R в квадрате, которые рассчитываются на протяжении сеанса.

Это в основном код, который вы разместили выше. На сервере я включил reactiveValues объект storage и 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, например.

Другие вопросы по тегам