Я обошел это, «обманув» R Shiny. Я делаю BOGUS textOutput, а в renderText вызывает внешнюю функцию, которая на основе выбранного входа устанавливает уже глобально загруженные среды в единую среду под названием «e». Обратите внимание, что вы должны вручную загружать все RDatas в среды в global.R во-первых, с таким подходом. Предполагая, что ваши данные не такие большие или что у вас нет миллиона RDatas, это кажется разумным взломом.
По существу создавая loadEnvFn(), как показано ниже, который возвращает входной поток, переданный в качестве входного параметра $ datasetNumber, вы можете избежать проблем с областью определения, возникающих при добавлении кода в реактивный ({}) контекст. Я пытался сделать TON вещей, но все они требовали реактивного контекста. Таким образом, я мог бы изменить объекты, загруженные в 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)
Я думаю, что это еще один шаг, он должен «загружать» перед вызовом 'shinyServer()'. Я никогда не мог загрузить load(), чтобы загрузить в правильную среду, когда я попытался загрузить ее либо внутри функции рендеринга, либо в пределах наблюдения. –
На самом деле, я просто попробовал, и все отлично с помощью 'runAppDir', где' load' вызывается в 'shinyServer' – csgillespie
Не возражаете ли вы его переустановить? Я бы с удовольствием посмотрел. –