【问题标题】:Persistent storage of data output in R shiny在 R 中持久存储数据输出
【发布时间】:2016-10-19 21:44:46
【问题描述】:

我正在开发一个应用程序(这是一个精简版),用户可以在其中上传.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)

【问题讨论】:

标签: r shiny persistent-storage


【解决方案1】:

我会使用reactiveValues 来处理这些东西。 它像一个列表一样工作,但它是反应式的,因此您可以在整个会话期间更改它。 这是一个示例,我使用它来存储在整个会话期间计算的 R 平方值。

基本上就是您在上面发布的代码。 在服务器中,我包含了一个reactiveValues 对象storage 和一个observeEvent,只要重新评估mdata(),它就会将storage$Rsquared 附加到R 平方。

这只是一个基本示例。 通过在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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多