【问题标题】:What is an environment where exists all objects from all files sourced when running Shiny App?什么是运行 Shiny App 时所有文件中的所有对象都存在的环境?
【发布时间】:2022-01-26 02:18:20
【问题描述】:

当 Shiny App 启动时,默认情况下它的来源是 e.g. R/app.R 文件或 server.Rui.R 文件中具有 .R 扩展名的所有文件。我想这些文件中的所有对象(主要是功能)都生活在一个共同的环境中。如何访问此环境?假设,我想在一些renderPrint 输出中列出此环境中的所有对象。我试过了:

output$env <- renderPrint({
    names(rlang::global_env())
  })

但它不起作用,它只找到".Random.seed"

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    根据this article

    Shiny 应用程序中的所有 R 代码都在全局环境或其子环境中运行

    我认为“or a child”是这里的关键。

    当您在环境中运行 Shiny 会话时 - 我们称之为 A。来自R/ 的所有函数都存储在另一个环境中——我们称之为B。现在,AB 都是全球环境的(祖)子,但 B 也是 A 的(祖)父。

    稍微简化一下,我们有这样的东西:

    +-- Global environment
    |   \-- B (where your functions live)
    |       \-- A (current environment)
    

    这就是为什么您可以从您的应用程序中访问这些函数,但您无法在全局环境或应用程序的当前环境中找到这些函数。

    示例

    为 Shiny 应用程序创建一个新文件夹,并将以下函数存储在 R/whatever.R 中:

    test_function <- function() print("TEST")
    

    现在,在您的应用程序中,执行以下操作:

    library(shiny)
    
    ui <- fluidPage(
        
        mainPanel(
            verbatimTextOutput("objects")
        )
    )
    
    server <- function(input, output) {
        
        test_function()
        
        output$objects <- renderPrint({
            
            x <- pryr::parenvs(rlang::current_env())
            
            for (i in seq_len(length(pryr::parenvs(rlang::current_env())))) {
                
                print(x[[i]])
                print(names(x[[i]]))
                print("-----------------------------")
                
            }
        })
        
    }
    
    shinyApp(ui = ui, server = server)
    

    这应该打印所有环境及其内容,从您当前的环境开始,到全球环境结束。 test_function 将存储在这些环境之间的某个位置。

    要使用您的函数访问环境,请编写一些逻辑来找到该环境,然后访问那里的所有内容。


    PS:如果您希望任何对象或函数在全局环境中可用,您可以在文件global.R 中创建它们。这将在应用程序启动时运行一次,并且应该使所有内容在全局环境中可用。阅读更多关于它的信息here

    【讨论】:

    猜你喜欢
    • 2021-12-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多