r - 在 R Shiny 中单独计算和绘图
问题描述
我想构建一个闪亮的应用程序,它运行一个模拟,然后显示 3 个结果图(我已经用 设置了它们tabsetPanel()
)。代码需要几秒钟才能运行,所以我做了一个submitButton()
. 现在由于代码需要更长的时间,我希望它只运行一次,然后显示 3 个图。如何使用输入值运行代码,提取 5 个结果向量,然后绘制它们?
目前闪亮给出一个错误,因为当代码不在output$plot <- renderPlot({ ...})
部件内时,它不是反应性的。
我到目前为止看起来像这样:
ui <- fluidPage(
titlePanel("My Simulation"),
submitButton(text="RUN SIMULATION")
mainPanel(
tabsetPanel(
tabPanel("Plot 1", plotOutput("p1")),
tabPanel("Plot 2", plotOutput("p2")),
tabPanel("Plot 3", plotOutput("p3"))
)
)
)
server <- function(input, output) {
v<-reactiveValues(v1=0,v2=0,v3,v4=0,v5=0)
observeEvent(input,{ myFunction()})
output$p1<-renderPlot{
plot(v1,v2)
}
output$p2<-renderPlot{
plot(v1,v3)
}
output$p3<-renderPlot{
plot(v1,v4)
lines(v1,v4)
}
shinyApp(ui, server)
解决方案
其实是分开的。要使情节具有反应性,您必须引用reactiveValues()
as v$v1
, v$v2
,... 它已分配给,v
因此您还必须以这种方式引用它。您实际上可以将reactiveValues()
与一个data.frame()
或更多类似的响应列表进行比较。v <- list(v1 = 1)
您还可以使用v$v1
,...调用的列表
可重现的例子:
library(shiny)
ui <- fluidPage(
titlePanel("My Simulation"),
actionButton(inputId = "simulate", label = "simulate"),
mainPanel(
tabsetPanel(
tabPanel("Plot 1", plotOutput("p1")),
tabPanel("Plot 2", plotOutput("p2")),
tabPanel("Plot 3", plotOutput("p3"))
)
)
)
server <- function(input, output) {
v <- reactiveValues(v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0)
observeEvent(input$simulate,{
v$v1 <- 1
v$v2 <- 2
v$v3 <- 3
v$v4 <- 4
})
output$p1<-renderPlot({
plot(v$v1, v$v2)
})
output$p2<-renderPlot({
plot(v$v1, v$v3)
})
output$p3<-renderPlot({
plot(v$v1, v$v4)
lines(v$v1, v$v4)
})
}
shinyApp(ui, server)
推荐阅读
- angularjs - 如何在不使用 $timeout 的情况下知道 AngularJS 摘要周期何时结束?
- docker - 在命令服务更新下会发生什么?
- opencv - 使用英特尔实感和 openCV 在特定虚拟区域上的对象体积
- regex - 如何将 regex101 中的工作正则表达式转换为 Coldfusion
- php - 语法错误,意外 '=>' (T_DOUBLE_ARROW),期待 ')'
- c# - 如何在类c#中存储引用变量
- javascript - 如何动态地将对象添加到 react-final-form 字段名称?
- c++ - 让我计算位移。我不知道根据这个程序的公式是什么
- php - yii2 中的 asArray() 将所有整数转换为字符串
- python - Yolo 从头开始数据集和输出