在global.R

时间:2018-03-23 11:01:31

标签: r shiny reactive-programming

背景

我有一个简单的应用程序在global.R中启动时加载了大量文件,加载数据文件的代码如下所示:

lst_dta <- lapply(X = seq_along(vec_dta_fls),
                                   function(i) {
                                       incProgress(
                                           amount = 1 / length(vec_dta_fls),
                                           message = paste("Reading file:", vec_dta_fls[i])
                                       )
                                       readr::read_rds(vec_dta_fls[i])

其中vec_dta_fls包含要提供的文件的文件路径。

问题

我想在withProgress调用中封装此过程,以提供有关进度的动态信息。

代码

withProgress(message = "Reading data files:",

             expr = {
                 lst_dta <- lapply(X = seq_along(vec_dta_fls),
                                   function(i) {
                                       incProgress(
                                           amount = 1 / length(vec_dta_fls),
                                           message = paste("Reading file:", vec_dta_fls[i])
                                       )
                                       readr::read_rds(vec_dta_fls[i])
                                   })
             })

错误消息

  

withProgress(message = "Reading data files:", expr = {中的错误:
  'session'不是ShinySession对象。

注释

我理解这是因为我在被动上下文中调用withProgress,如linked article中所述:

  

添加进度指示器的最简单方法是使用withProgress()   在reactive(),observer()或renderXx()

我有办法解决吗?对于这种特殊情况,我不想在被动上下文中调用withProgress,因为实际上我只想显示此加载消息一次。

1 个答案:

答案 0 :(得分:1)

我想这可以解决问题

<强> server.R

library(shiny)
shinyServer(function(input, output, session) {

    load_data()

    output$title_loaded_from_global <- renderUI({
        strong(title_ui)
    })

    output$my_summary <- renderPrint({
        summary(data1)
    })

})

<强> ui.R

library(shiny)
shinyUI(fluidPage(
    uiOutput("title_loaded_from_global")
    ,verbatimTextOutput("my_summary")
))

<强> global.R

load_data <- function() {
    withProgress(message = 'Load data and title...', value = 0.5, {
        # Load data
        Sys.sleep(2)
        data1 <<- iris
        title_ui <<- "A great iris summary"
    })
}