允许用户通过CSV加载数据或使用示例数据集

时间:2016-04-08 05:12:57

标签: r shiny

我正在建立一个由

组成的闪亮应用程序
  1. fileInput,供用户上传交易CSV
  2. 一个actionButton,允许用户使用预先构建的数据集测试应用程序(即无需加载自己的数据)。
  3. 一个verbatimTextOutput,用于打印他们正在使用的数据集的预览和
  4. 使用所选数据集构建的各种绘图和图表
  5. 如果用户上传文件,该数据集应该成为" master" transactions数据集用于提供应用的其余部分。然后,如果他们点击"加载样本数据"按钮, datset应该变成" master" transactions数据集。 (将这个想法外推到他们上传数据和点击按钮之间的多次交替)

    我可以按照以下方式工作:

    # app.R    
    
    library(data.table)
    library(shiny)
    
    # UI
    ui <- shinyUI(fluidPage(
      fileInput(inputId='fi_file', label='Choose CSV File', accept=c('text/csv', 'text/comma-separated-values,text/plain', '.csv')),
      actionButton(inputId="ab_loadSampleTransactions", label="Load Sample Transactions"),
      verbatimTextOutput("vto_transactions")
    ))
    
    
    # Server
    server <- shinyServer(function(input, output) {
    
      # When the user uploads a file, print it
      observeEvent(input$fi_file, {
        transactions <- read.csv(input$fi_file$datapath)
        output$vto_transactions <- renderPrint(transactions)
      })
    
      # When the user clicks the button for sample transactions, print them
      observeEvent(input$ab_loadSampleTransactions, {
        transactions <- data.table(ID=c(1,2,3), Amount=c(100, 150, 125))
        output$vto_transactions <- renderPrint(transactions)
      })
    
      # More logic involving the transactions dataset
      # ...
    
    })
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

    但是,这样做效率很低,因为它需要我加载transactions数据集两次才能显示用它来做未来的逻辑。我想我需要在这里做一些反应,但我无法弄清楚,因为我有两个单独的方法来加载数据。帮助

1 个答案:

答案 0 :(得分:2)

请勿使用全局变量,例如评论中的建议。

使用reactiveValues。听起来你不需要这个变量是“全局的”,因为它需要与UI和其他文件共享 - 它只需要在服务器中是全局的,对吗?在这种情况下,您可以使用reactiveValues,并且可以在服务器的任何位置访问和设置这些变量