在R Shiny中如何实现滑动条对初始场景1的响应式更新?
实现思路
你只需要做两处核心调整:
- 新增一个锁标记判断「Add scenario」按钮是否被点击过,未点击时允许滑动条修改场景1数据,点击后锁定场景1不再修改
- 替换原有无效的
input$periods监听逻辑,改为监听滑动条input$samples变化,在未锁定时更新场景1数据
完整可运行代码
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)), scenario1_locked = FALSE # 新增锁标记,初始为未锁定 ) # 监听滑动条变化,未锁定时更新场景1 observeEvent(input$samples, { if(!v$scenario1_locked){ v$results <- tibble(Scenario=1, X=1:input$samples, Y=runif(input$samples)) } }) observeEvent(input$add, { showModal(modalDialog(footer = modalButton("Close"))) v$scenario1_locked <- TRUE # 点击按钮后锁定场景1 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)
改动说明
- 新增
scenario1_locked响应式标记,初始为FALSE,点击「Add scenario」按钮后设置为TRUE - 替换原来无效的
input$periods监听,改为监听input$samples,每次滑动条变化时判断如果场景1未锁定,就重新生成场景1的样本数据 - 点击新增场景按钮时先锁定场景1,之后滑动条改动不会再影响已经生成的所有场景数据,符合原有逻辑
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

