Shiny中eventReactive为何在用户交互UI元素前就启动运行?
解决Shiny中eventReactive启动时自动触发的问题
你的问题出在eventReactive的默认行为上:它会在应用初始化阶段,当所有触发依赖的初始值存在时自动执行一次。input$do_search作为actionButton初始值为0,input$search_tolerance作为滑块也有默认初始值,所以程序启动时就满足了触发条件,导致代码提前运行。
最直接的解决方案:添加ignoreInit = TRUE参数
给eventReactive加上ignoreInit = TRUE,就能让它忽略初始化时的触发,只在用户点击搜索按钮或调整滑块时才执行:
server <- function(input, output, session) { filtered_df <- eventReactive( { input$do_search input$search_tolerance }, { enable("search_results") print("Performing search...filtering results and calculating match") if(is.null(input$ingredients)) { calculate_match_score(cases_df, input$search_term) %>% filter(match_score <= input$search_tolerance) } else { calculate_match_score(filter(cases_df, PRIMARY_SUSPECT_KEY_INGREDIENT %in% input$ingredients), input$search_term) %>% filter(match_score <= input$search_tolerance) } }, ignoreInit = TRUE # 新增参数,跳过初始化触发 ) output$search_results <- renderDataTable(filtered_df()) }
补充说明
- 反应式内部不需要再次赋值
filtered_df,eventReactive会自动把代码块的返回值作为反应式对象的内容。 - 如果希望只有点击搜索按钮才触发计算(调整滑块不自动触发),可以把触发条件简化为
input$do_search,同时保留ignoreInit = TRUE,滑块的值会在点击按钮时被读取使用。
内容的提问来源于stack exchange,提问作者smackenzie
相关产品推荐
相关产品推荐

