【问题标题】:Displaying progress indicator while loading external objects in global.R在 global.R 中加载外部对象时显示进度指示器
【发布时间】:2018-03-23 11:01:31
【问题描述】:

背景

我有一个简单的应用程序,在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,因为实际上我只想显示此加载消息一次。

【问题讨论】:

    标签: r shiny reactive-programming


    【解决方案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"
        })
    }
    

    【讨论】:

    • 这里有一个问题;在global.R 中创建对象使它们可以在ui.Rserver.R 中访问。如果我按照您的建议进行操作,我将不得不在ui.R 中运行此功能; wiithProgress 接受 session 参数是否没有办法找到它并传递给 progress 函数?
    • 你是对的!我发现的唯一一个解决方案是从服务器端使用renderUI。我更新了我的答案
    • 非常感谢您的贡献,我将等待一两天,看看是否没有人使用会话 ID 提供解决方案。我可能弄错了,但在我看来,应该可以通过获取应用会话 ID 并将其强制作为withProgress 的参数来让这个东西工作。我认为session 对象应该有 相关信息。我认为它与使用ns &lt;- session$ns 所讨论的here 相距不远。对我来说如何做到这一点并不明显。
    猜你喜欢
    • 2017-01-11
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2012-04-22
    • 2011-09-29
    • 1970-01-01
    • 2019-05-15
    • 2021-03-26
    相关资源
    最近更新 更多