在上传的csv文件上运行脚本闪亮

时间:2016-09-06 14:12:11

标签: r shiny

我正在尝试构建一个从用户那里获取csv文件的应用程序,上传它,然后用户填写一些文本框,这些文本框将在稍后填充数据框中的特定列,单击按钮&#39 ; GO',一些脚本在后台运行,我们有一个数据框可供下载。问题是整个反应式架构使得难以建立一步一步的算法。你能帮我设置这样做的框架吗?理想情况下,它看起来如下

shinyUI(fluidPage(
           titlePanel("Uploading Files"),
           fileInput('file1', 'Choose file to upload',
                         accept = c('text/csv',
                         'text/comma-separated-values',
                         'text/tab-separated-values',
                         'text/plain','.csv','.tsv')),        
           dateInput('date',"Select when the file was uploaded",
                      value = NULL,
                      format = 'yyyy-mm-dd'),
           textInput('text1','Type what will be in column 6'),
           textInput('text2','Type what will be in column 7'),
           actionButton('go','go'),
           tableOutput('readytable')

现在有了这个前端我希望:1。从用户的csv加载数据帧2.等待用户填写其他输入框3.点击&#39; go&#39;使用用户已插入的输入(例如df$column6 <- input$text1)在数据帧上运行一堆函数,然后我再次使用准备再写为csv文件的数据帧。提前感谢任何链接/建议

1 个答案:

答案 0 :(得分:1)

您可以使用反应变量来控制闪亮的反应性。以下是您的问题的示例。请注意,下载按钮在RStudio查看器上不起作用,因此如果要使用下载按钮,请在浏览器中启动应用程序。

library(shiny)
runApp(list(
  ui = shinyUI(pageWithSidebar(
  headerPanel('Uploading Files'),
  sidebarPanel( 
           fileInput('file1', 'Choose file to upload',
                         accept = c('text/csv',
                         'text/comma-separated-values',
                         'text/tab-separated-values',
                         'text/plain','.csv','.tsv')),
    uiOutput('buttonsUI'), br(),
    uiOutput('downloadUI')
  ),
  mainPanel(
    tableOutput('readytable')
  )
)), 
  server = shinyServer(function(input, output) {
    # variables to control the sequence of processes 
    controlVar <- reactiveValues(fileReady = FALSE, tableReady = FALSE)
    # to keep the data upload
    dat <- NULL
    # handle the file reading
    observeEvent(input$file1, {
      controlVar$fileReady <- FALSE
      if (is.null(input$file1))
        return()
      inFile <- input$file1
      dat <<- read.csv(inFile$datapath)
      if(!is.data.frame(dat))
        return()
      controlVar$fileReady <- TRUE
    })
    # show buttons only when file is uploaded
    output$buttonsUI <- renderUI({
      if (controlVar$fileReady)
        div(
          dateInput('date','Select when the file was uploaded',
                      value = NULL,
                      format = 'yyyy-mm-dd'),
           textInput('text1','Type what will be in column 6'),
           textInput('text2','Type what will be in column 7'),
           actionButton('go','go')

        )
    })
    # show a download button only if data is ready
    output$downloadUI <- renderUI({
      if (controlVar$tableReady)
            downloadButton('downloadData', 'Download')
    })
    # add columns to dat and run some script on it
    observeEvent(input$go, {
      controlVar$tableReady <- FALSE
      if (!is.null(input$text1))
        dat$column6 <<- input$text1
      if (!is.null(input$text2))
        dat$column7 <<- input$text2
      # simulate running a cool script on dat
      Sys.sleep(2)
      controlVar$tableReady <- TRUE  
    })
    # render table after uploading file or running the script
    output$readytable <- renderTable({
      input$go
      if (controlVar$fileReady || controlVar$tableReady)
         dat
    })
    # handle the download button
    output$downloadData <- downloadHandler(
      filename = function() { 'newData.csv' },
      content = function(file) {
        write.csv(dat, file)
      }
    )
  })
))