在 R Shiny 中,如何实现反应函数?

In R Shiny, how to implement a reactive function?

在下面的 MWE 代码中,我想更改场景数量的滑块输入,以响应地更改首次呈现的场景 1(在单击“添加场景”操作按钮之前)。一旦通过单击操作按钮(场景 2、3 等)添加了另一个场景,场景 1 将保持在滑块输入更改时的位置。底部显示的图像应该更好地解释:

(顺便说一句,不要担心此操作按钮会触发空白模式对话框——我需要它以备后用)。

任何人都可以帮助使滑块输入对场景 1 具有反应性吗?

请注意,在点击“添加场景”时,之前的滑块输入会正确地“凝胶”运行(不要更改)。

MWE 代码:

library(shiny)
library(tidyverse)
library(ggplot2)

ui <- fluidPage(
  sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
  actionButton("add", "Add scenario"),
  plotOutput("plot"),
)

server <- function(input, output, session) {
  
  v <- reactiveValues(results=tibble(Scenario=1, X=1:10, Y=runif(10)))
  
  observeEvent(req(input$periods), {
    v <- reactiveValues(results=tibble(Scenario=1,X=1:input$samples,Y=input$samples))
  })
  
  observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
    newData <- tibble(Scenario=max(v$results$Scenario)+1,X=1:input$samples,Y=runif(input$samples))
    v$results <- v$results %>% bind_rows(newData)
  })
  
  output$plot <- renderPlot({
    v$results %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
  })
}

shinyApp(ui, server)

看看这是否有效。理想情况下,您应该使用 map_dfr 或类似的函数来生成标题。但是为了使代码易于理解,我只使用了一个 for 循环。

library(shiny)
library(tidyverse)
library(ggplot2)

ui <- fluidPage(
  sliderInput('samples','Number of samples (X):',min=2,max=10,value=10),
  actionButton("add", "Add scenario"),
  plotOutput("plot"),
)

server <- function(input, output, session) {
  
  numScenarios <- reactiveValues(numS=1)
  
  observeEvent(input$add, {showModal(modalDialog(footer = modalButton("Close")))
    numScenarios$numS <- (numScenarios$numS+1)
  })
  
  output$plot <- renderPlot({
    v <- tibble()
    for (i in 1: numScenarios$numS){
      results=tibble(Scenario=i,X=1:input$samples,Y=runif(input$samples))
      v <- bind_rows(v, results)
    }
    v %>% ggplot() + geom_line(aes(x=X, y=Y, colour=as.factor(Scenario)))
  })
}

shinyApp(ui, server)