首页 > 解决方案 > 在 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)

标签: rshiny

解决方案


其实是分开的。要使情节具有反应性,您必须引用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)

推荐阅读