【问题标题】:Optimizing Performance - Large File Input in Shiny优化性能 - Shiny 中的大文件输入
【发布时间】:2019-12-29 23:20:04
【问题描述】:

我在文件 CheckClawback.R 中定义了一个函数 (clawCheck),它接受三个数据帧作为参数。在我的 Shiny 应用程序中,用户上传三个文件,然后将这些文件读入内存并用作 ClawCheck 参数。为了节省时间,我希望 R 在文件上传后立即开始将文件读入内存,而不仅仅是在按下“GO”按钮之后,这样一旦按下按钮,ClawCheck 的参数就已经在内存并准备好使用。

我认为我必须在 renderTable 语句中使用 eventReactive 表达式,因为我不希望每次用户更改某些输入时都重新读取文件。为了避免进一步的复杂化,我假设输入是按顺序填写的,即首先是“account”,然后是“commpaid”,然后是“termriders”。当我运行应用程序并上传第一个输入文件时,没有出现进度条,这表明我的代码工作不正常。这是我的(简化的)代码:

library('shiny')

source("CheckClawback.R")

ui <- fluidPage(

  sidebarLayout(

    sidebarPanel(

      fileInput("account", "Account File (.csv)"), 

      fileInput("commpaid", "CommPaid File (.txt)"), 

      fileInput("termriders", "TermRiders File (.txt)"), 

      actionButton("do", "GO!")),

    mainPanel(
      tableOutput("out_table"))
  )
)


server <- function(input, output) {


  func <- eventReactive(input$do, {

    req(acc)
    req(comm)
    req(term)

    datat <<- clawCheck(acc, comm, term)

  })


  output$out_table <- renderTable({

    eventReactive(input$account, {

      withProgress(message = "Preparing Account Data...Please Wait", {

      acc <<- read.csv(input$account$datapath, header = TRUE, sep = ",")

      })
    })

    eventReactive(input$commpaid, {

      withProgress(message = "Preparing CommPaid Data...Please Wait", {

        comm <<- read.table(input$commpaid$datapath, header = TRUE, sep = "\t")

      })
    })

    eventReactive(input$termriders, {

      withProgress(message = "Preparing TermRiders Data...Please Wait", {

        term <<- read.table(input$termriders$datapath, header = TRUE, sep = "\t")

      })
    })

    withProgress(func(), message = "Loading Output...Please Wait")

    datat
  })

}

shinyApp(ui = ui, server = server)

理想情况下,文件上传后,应该会出现一个进度条,表明它正在处理中。如果在此过程中上传了第二个文件,则应出现第二个进度条,指示正在处理第二个文件等。一旦发生实际函数调用,我希望输入文件准备就绪。

非常感谢您的帮助!

【问题讨论】:

    标签: r shiny reactive shiny-reactivity


    【解决方案1】:

    您对&lt;&lt;-withProgress() 的使用是错误的。此外,在 render*() 中使用 eventReactive() 是错误的。我建议阅读 RStudio Shiny 教程,以帮助了解 reactivity 的工作原理。另请查看showNotification() 而不是withProgress()。现在,这就是您可能需要的 -

    server <- function(input, output, session) {
    
      acc <- reactive({
        validate(need(input$account), "acc not uploaded")
        # use showNotification(); use same approach for other files
        read.csv(input$account$datapath, header = TRUE, sep = ",")
        # use removeNotification() to remove mesg after file is uploaded
      })
    
      comm <- reactive({
        validate(need(input$commpaid), "comm not uploaded")
        read.table(input$commpaid$datapath, header = TRUE, sep = "\t")
      })
    
      term <- reactive({
        validate(need(input$termriders), "term not uploaded")
        read.table(input$termriders$datapath, header = TRUE, sep = "\t")
      })
    
    
      func <- eventReactive(input$do, {
        clawCheck(acc(), comm(), term())
      })
    
    
      output$out_table <- renderTable({
        func()
      })
    
    }
    

    【讨论】:

    • 感谢您的帮助!对于我笨拙地使用闪亮的表达方式,我深表歉意——这是我第一次使用闪亮的表情。我仍然很难理解反应性,但如果我理解正确,acc 只有在其反应性依赖项之一(即 input$account)发生变化并且通过使 acc 反应性时才会更新,任何依赖于 acc 的东西都会随时更新 acc变化等??我遇到的一个问题是,即使我将所有输入都留空并按“GO”,验证错误消息也不会显示......你知道这可能来自哪里吗?非常感谢!
    • @Leon231000 首先不需要道歉。只需按顺序阅读 RStudio 教程就可以了。您对 acc 的反应性是正确的。对于验证消息,看看我更新的代码是否有效。
    猜你喜欢
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多