Shiny(R)中的自引用反应变量

Cze*_*law 5 recursion r reactive-programming shiny

我正在构建一个闪亮的应用程序,定期读取新数据,然后使用该数据和先前的参数估计来产生新的参数估计(等等无限制).

问题是参数必须通过响应来更新数据更新时,还需要引用其先前的值,我不知道如何使用其当前值来计算其下一个值而没有闪亮的抱怨无限递归.下面是一个最小的例子,它打算打印一个每秒递增1的值.

library(shiny)

omega <- 0

# Define the UI
myui <- basicPage(  
    textOutput('var')
)

# Define the server code
myserver <- function(input, output, session) {

    omega <<- reactive({
        invalidateLater(1000, NULL)
        return(omega() + 1)
    })

    output$var <- renderText(omega())
}


# Return a Shiny app object
shinyApp(ui = myui, server = myserver)
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误

evaluation nested too deeply: infinite recursion / options(expressions=)?
Run Code Online (Sandbox Code Playgroud)

如果我尝试通过使用isolate()来保护对omega中的omega()的调用,我会从C堆栈溢出中获得段错误.

有没有办法来解决这个问题?或者也许是一个更好的方式来做我想要的闪亮?

Ind*_*yen 4

这是问题的快速解决方案,但并没有完全解决问题。

library(shiny)

omega_nr <- 0

# Define the UI
myui <- basicPage(  
  textOutput('var')
)

# Define the server code
myserver <- function(input, output, session) {

  omega <- reactive({
    invalidateLater(1000, session)
    return(omega_nr)
  })

  # update non reactive value
  observe({
    omega()
    omega_nr<<-omega_nr+1
  })

  output$var <- renderText(omega())
}


# Return a Shiny app object
shinyApp(ui = myui, server = myserver)
Run Code Online (Sandbox Code Playgroud)

这是可行的,我刚刚测试过。

我会尝试其他选择并让您知道。同时我也对精确解感兴趣。但不知怎的,我觉得不应该实现自引用反应。但我可能是错的..