【问题标题】:In R shiny, when using tibble function of tidyverse package, why does my App crash?在 R shiny 中,使用 tidyverse 包的 tibble 功能时,为什么我的应用程序崩溃了?
【发布时间】:2021-11-29 11:19:27
【问题描述】:

只要服务器部分v <- reactiveValues(results=tibble(Scenario = 1, data())) 中的行被注释掉,下面的代码就可以正常运行。当我取消注释时,应用程序崩溃并收到错误消息:警告:错误:无法在反应性消费者之外访问反应性值“input1”。 i 你需要包裹在reactive() 或observer() 里面吗?

我正在尝试使用tibble 创建一个向量以添加另一个函数。我在使用tibble 时做错了什么?我试图通过tibble 捕获由我的自定义interpol 函数生成的值,当它通过下面的data() 函数从矩阵input2 获取输入时。我还尝试了c()、as.vector() 等,以确保将input2 转换为向量,但我仍然得到同样的错误。

我对@9​​87654331@ 和tidyverse 等完全陌生。

代码:

library(shiny)
library(shinyMatrix)
library(tidyverse) # < ADDED

interpol <- function(a,b){ # a = periods, b = matrix inputs
  c    <- rep(NA,a)
  c[1] <- b[1]
  c[a] <- b[2]
  c <- approx(seq_along(c)[!is.na(c)],c[!is.na(c)],seq_along(c))$y # this interpolates
  return(c)
}

ui <- fluidPage(
    sidebarLayout(
      sidebarPanel(uiOutput("panel"),actionButton("showInput2","Modify/add interpolation")),
      mainPanel(plotOutput("plot"))
    )
  )

server <- function(input, output, session){

data <- function(){
  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])))}}
  }  

  # v <- reactiveValues(results=tibble(Scenario = 1, data()))
  
  output$panel <- renderUI({
    tagList(
      sliderInput('periods','Interpolate over periods (X):',min=2,max=12,value=6),
      uiOutput("input1"))
  })

  output$input1 <- renderUI({
    matrixInput("input1", 
                label = "Interpolation 1 (Y values):",
                value =  matrix(if(isTruthy(input$input2)){c(input$input2[1],input$input2[2])} 
                                  else {c(1,5)},                          # matrix values
                                1, 2,                                     # matrix row/column count
                                dimnames = list(NULL,c("Start","End"))),  # matrix column header
                rows =  list(names = FALSE), class = "numeric")
  })
  
  observeEvent(input$showInput2,{
    showModal(
      modalDialog(
        matrixInput("input2",
          label = "Automatically numbered scenarios (input into blank cells to add):",
          value = if(isTruthy(input$input2)){input$input2}
                  else if(isTruthy(input$input1)){input$input1},
          rows =  list(names = FALSE),
          cols =  list(extend = TRUE, delta = 2, delete = TRUE, multiheader=TRUE),
          class = "numeric"),
    footer = modalButton("Close")
    ))
  })

  observe({
    req(input$input2)
    mm <- input$input2
    colnames(mm) <- paste(trunc(1:ncol(mm)/2)+1, " (start|end)")
    isolate(updateMatrixInput(session, "input2", mm))
  })
  
  output$plot<-renderPlot({plot(data(),type="l",xlab="Periods (X)", ylab="Interpolated Y values")})
  
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny tidyverse tibble shiny-reactivity


    【解决方案1】:

    错误的原因和解决方案实际上存在于错误消息本身中。您无法在反应式上下文之外访问 reactive 变量 (data())。尝试将v 输出包装在reactive 中。

    v <- reactive({tibble(Scenario = 1, data())})
    

    【讨论】:

    • 是的,您的解决方案有效。但我曾假设之前使用的“reactiveValues”会起到同样的作用。
    • 其实我在这里找到了关于 reactive() 和 reactiveValues() 区别的一个很好的解释:stackoverflow.com/questions/39436713/…
    • 从这个问题中可以看出我对你的previous question的回答。在这种情况下,接受答案是有礼貌的。
    • 好的,谢谢 Limey!
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多