根据this article:
Shiny 应用程序中的所有 R 代码都在全局环境或其子环境中运行
我认为“or a child”是这里的关键。
当您在环境中运行 Shiny 会话时 - 我们称之为 A。来自R/ 的所有函数都存储在另一个环境中——我们称之为B。现在,A 和 B 都是全球环境的(祖)子,但 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。