R Shiny使用tidyverse的tibble函数时应用崩溃问题咨询
错误原因
你的报错和tibble使用没有关系,是违反了Shiny的响应式访问规则:
- Shiny中所有访问
input、reactive等响应式对象的代码,必须放在reactive()、observe()、renderXXX()这类响应式上下文内部 - 你直接在server函数的顶层作用域调用
data(),而data()内部引用了input$input1、input$periods等响应式变量,这行代码会在应用启动时立即执行,此时不仅响应式变量还未初始化,也没有处于合法的响应式上下文中,因此直接触发报错
修复方案
第一步:将data函数改造为Shiny响应式表达式
# 把原来的普通data函数改成reactive响应式对象 data <- reactive({ if(!isTruthy(input$input1)){ interpol(6,matrix(c(1,5))) } else { if(!isTruthy(input$input2)){ interpol(input$periods, matrix(c(input$input1[1,1],input$input1[1,2]))) } else { interpol(input$periods,matrix(c(input$input2[1,1],input$input2[1,2]))) } } })
第二步:调整reactiveValues的初始化和更新逻辑
不要在初始化reactiveValues时直接调用响应式对象,改为先设默认值,再用observe监听响应式变量变化自动更新:
# 初始化时用静态默认值,不访问响应式变量 v <- reactiveValues(results = tibble(Scenario = 1, value = interpol(6, matrix(c(1,5))))) # 监听data()的变化,自动更新存储的结果 observe({ v$results <- tibble(Scenario = 1, value = data()) })
后续使用说明
- 原来
renderPlot里的plot(data(), type="l", ...)不需要修改,本身已经处于响应式上下文 - 如果后续需要新增多个场景存储,可以在更新
v$results时用dplyr::bind_rows()追加行,tibble原生支持存储向量类型的列,不需要额外做类型转换
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

