使在一个反应性对象内创建的对象对另一个对象可用 [英] Make object created inside one reactive object available to another in shiny
问题描述
我有一个闪亮的应用程序,其中我基于滑块定义对象并从中创建data.frame
.这将用于创建绘图,在该绘图下方我想包含一个汇总表.我的问题是必须在反应对象内部定义图以基于滑块进行更新,但是我发现当我尝试访问对象以在不同反应对象内部打印摘要时,找不到.
I have a shiny app in which I define an object based on sliders and create a data.frame
from it. This gets used to create a plot, below which I'd like to include a summary table. My issue is that the plot must be defined inside of a reactive object to update based on the sliders, but I found that when I tried to access the object to print a summary inside of a different reactive object, it wasn't found.
我不想让相同的计算代码运行两次,只是为了使该对象进入另一个反应对象.我的两个初步想法:
I'd like to not run through the same calculation code twice just to get the object into the other reactive object. My two initial ideas:
- 我尝试在第一个反应对象中使用
save(object, file = "...")
,然后在第二个反应对象中使用load(file = "...")
,但是它没有更新. - 我曾想过在反应式
plotOutput
定义之外定义对象,但是我敢肯定,当用户输入更改时,它不会更新.它只会保留初始input
对象默认设置的值.
- I tried using
save(object, file = "...")
inside the first reactive object and then puttingload(file = "...")
inside the second, but it doesn't update. - I thought of defining my object outside of my reactive
plotOutput
definition, but I'm pretty sure it won't update when user inputs are changed; it will just stay with the value of the initialinput
object default settings.
好吧,只是继续尝试了后一个想法,它甚至还没有走得那么远:
Well, just went ahead and tried the latter idea, and it doesn't even get that far:
- 我将其放在
shinyServer(...)
之前,并且它无法生成数据,因为我的通话取决于input
,并且此时不知道input
. - 我把它放在
shinyServer(...)
之后但在renderPlot(...)
之前,试图为所有输出对象创建某种全局可用"的对象,这让我为尝试做一些在反应式之外使用input
的事情而感到责备功能.
- I put it before
shinyServer(...)
and it can't generate the data because my call depends oninput
and it doesn't know aboutinput
at that point. - I put it after
shinyServer(...)
but beforerenderPlot(...)
to try and make sort of a "globally available" object for all output objects, and it scolding me for trying to do something that usesinput
outside of a reactive function.
下面是一个示例,该示例是从Shiny的"Hello Shiny!"修改而来的.例子:
Here's an example to illustrate, modified from Shiny's "Hello Shiny!" example:
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
.如果您取消注释我们在plotOutput
中重新定义dist
的行,则它将起作用.
If you run it as is, cut
will throw and error because it doesn't know about dist
. If you uncomment the line where we re-define dist
as is done in plotOutput
, then it will work.
这是简单的代码-我的代码涉及更多,我真的不希望只运行两次以使另一个反应式输出知道相同的结果.
This is simple code -- mine is quite a bit more involved and I'd really prefer not to run it twice just to make the same result known to another reactive output.
建议?
推荐答案
仅基于 查看全文