我通过“欺骗”R Shiny 解决了这个问题。我创建了一个 BOGUS textOutput,并在 renderText 中调用了一个外部函数,该函数基于所选的输入,将已经全局加载的环境设置为一个名为“e”的环境。请注意,您必须首先使用这种方法将所有 RDatas 手动加载到 global.R 中的环境中。假设您的数据不是那么大,或者您没有一百万个 RData,这似乎是一个合理的 hack。
通过本质上创建如下所示的 loadEnvFn(),它返回作为 input$datasetNumber 传递的字符串输入,您可以避免将代码放入 reactive({}) 上下文时发生的范围问题。我试图做很多事情,但它们都需要反应式上下文。这样,我可以更改在 e 中加载的对象,而不必在我闪亮的服务器代码周围包装一个响应式 ({}) 范围。
#Global Environment Pre-loaded before Shiny Server
e = new.env()
dataset1 = new.env()
load("dataset1.RData", env=dataset1)
dataset2 = new.env()
load("dataset2.RData", env=dataset2)
dataset3 = new.env()
load("dataset3.RData", env=dataset3)
ui = fluidPage(
# Application title
titlePanel(title="View Datasets"),
sidebarLayout(
# Sidebar panel
sidebarPanel(width=3, radioButtons(inputId = "datasetNumber", label = "From which dataset do you want to display sample data?", choices = list("Dataset1", "Dataset2", "Dataset3"), selected = "Dataset2")
),
# Main panel
mainPanel(width = 9,
textOutput("dataset"), # Bogus textOutput
textOutput("numInEnv")
)
)
)
loadEnvFn = function(input) {
if (input$datasetNumber=="Dataset1") {
.GlobalEnv$e = dataset1
} else if (input$datasetNumber=="Dataset2") {
.GlobalEnv$e = dataset2
} else {
.GlobalEnv$e = dataset3
}
# Bogus return string unrelated to real purpose of function loadEnvFn
return(input$datasetNumber)
}
server = function(input, output, session) {
output$dataset = renderText(sprintf("Dataset chosen was %s", loadEnvFn(input))) # Bogus output
output$numInEnv = renderText(sprintf("# objects in environment 'e': %d", length(ls(e))))
}
shinyApp(ui, server)