Сделать объект, созданный внутри одного реактивного объекта, доступным для другого в блестящем [дубликате]
На этот вопрос уже есть ответ:
Установить глобальный объект в Shiny 1 ответ У меня блестящее приложение, в котором я определяю объект на основе ползунков и создаюdata.frame
от него. Это используется для создания графика, ниже которого я хотел бы включить сводную таблицу. Моя проблема в том, что график должен быть определен внутри реактивного объекта для обновления на основе ползунков, но я обнаружил, что при попытке получить доступ к объекту, чтобы напечатать сводку внутридруго реактивный объект не найден.
Я бы не хотел дважды проходить один и тот же код расчета, чтобы вставить объект в другой реактивный объект. Мои две первоначальные идеи:
Я пытался использоватьsave(object, file = "...")
внутри первого реактивного объекта, а затем положитьload(file = "...")
внутри второго, но не обновляется. Я думал об определении моего объекта вне моего реактивногоplotOutput
определение, но я уверен, что оно не будет обновляться при изменении пользовательских данных; он просто останется со значением начальногоinput
настройки объекта по умолчанию.Ну, просто пошел дальше и попробовал последнюю идею, и она даже не зашла так далеко:
Я поставил это передshinyServer(...)
и он не может сгенерировать данные, потому что мой звонок зависит отinput
и он не знает оinput
в таком случае Я положил его послеshinyServer(...)
но преждеrenderPlot(...)
чтобы попытаться сделать своего рода «глобально доступный» объект для всех выходных объектов, и это ругает меня за попытку сделать что-то, использующееinput
вне реактивной функции.Вот пример для иллюстрации, модифицированный от Shiny's "Привет, Блестящий!" приме:
Ui.R
library(shiny)
# Define UI for application that plots random distributions
shinyUI(pageWithSidebar(
# Application title
headerPanel("Hello Shiny!"),
# Sidebar with a slider input for number of observations
sidebarPanel(
sliderInput("obs",
"Number of observations:",
min = 1,
max = 1000,
value = 500)
),
# Show a plot of the generated distribution
mainPanel(
plotOutput("distPlot"),
tableOutput("summary")
)
))
Server.R
library(shiny)
# Define server logic required to generate and plot a random distribution
shinyServer(function(input, output) {
output$distPlot <- renderPlot({
# generate an rnorm distribution and plot it
dist <- rnorm(input$obs)
hist(dist)
})
output$summary <- renderTable({
#dist <- rnorm(input$obs)
summary <- table(data.frame(cut(dist, 10)))
})
})
Если ты запустишь все как есть,cut
сгенерирует ошибку, потому что не знает оdist
. Если вы раскомментируете строку, где мы переопределимdist
как сделано вplotOutput
, тогда это будет работать.
Это простой код - мой более сложный, и я бы предпочел не запускать его дважды, просто чтобы тот же результат был известен другому реактивному выводу.
Suggestions?