Постоянное хранение выходных данных в R shiny

#r #shiny #persistent-storage

#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. Вероятно, вам нужна глобальная переменная shiny.rstudio.com/articles/scoping.html

Ответ №1:

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

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