如何在Shiny的app.R中添加更新按钮并实现点击才更新数据的效果
你当前的代码存在两个核心问题导致参数自动更新:
- 输出的
renderText直接绑定了实时变化的input$fruitchoice、input$amt控件值,只要控件值发生变化,输出就会同步更新,和你定义的eventReactive没有任何关联 - 你定义的
SelectInput响应式变量内部调用runif的逻辑完全错误,也没有返回我们需要的订单参数,属于无效代码
另外selectInput的默认选中值"Percent White"不在可选水果列表内,属于小bug。
修复后完整代码
library(shiny) ui <- fluidPage( titlePanel("My Simple App"), sidebarLayout( sidebarPanel( helpText("Controls for my app"), selectInput("fruitchoice", label = "Choose a fruit", choices = list("Apples", "Oranges", "Mangos", "Pomegranate"), selected = "Apples"), # 修正默认选中值为可选列表内的项 sliderInput("amt", label = "Order Amount:", min=0, max = 100, value=20), actionButton ("Update","Update Order") ), mainPanel( helpText("Fruit Chosen:"), verbatimTextOutput("fruit"), helpText("Order Amount"), verbatimTextOutput("amt") ) ) ) server <- function(input, output) { # 仅在点击Update Order按钮时才更新订单信息 # 保留ignoreNULL = FALSE则页面加载时就显示默认值,无需等待第一次点击,不需要可删除该参数 order_info <- eventReactive(input$Update, { list( fruit = input$fruitchoice, amt = input$amt ) }, ignoreNULL = FALSE) output$fruit = renderText(order_info()$fruit) output$amt = renderText(order_info()$amt) } # Run the application shinyApp(ui = ui, server = server)
改动说明
- 修正了
selectInput的默认选中值,避免初始化报错 - 重写了
eventReactive逻辑,点击按钮时将当前选择的水果、数量打包为列表返回 - 两个输出不再读取实时的控件值,改为仅读取点击按钮后才更新的
order_info响应式变量,实现只有点击按钮才同步参数的效果
内容的提问来源于stack exchange,提问作者TheNewCoder
相关产品推荐
相关产品推荐

