繁体   English   中英

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

[英]Self-referencing reactive variables in Shiny (R)

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

问题是参数必须在数据更新时通过reactive来更新,但也需要引用它的先前值,我不知道如何使用它的当前值来计算它的下一个值而不会抱怨无限递归。 下面是一个最小的例子,它旨在打印一个每秒递增 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)

这会产生以下错误

evaluation nested too deeply: infinite recursion / options(expressions=)?

如果我尝试通过使用isolate() 来保护omega() 内的omega() 调用,我会从C 堆栈溢出中得到一个段错误。

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

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

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)

这是有效的,我刚刚对其进行了测试。

我会尝试其他选择并告诉您。 同时我也对精确解感兴趣。 但不知何故,我觉得不应实施自引用反应式。 但我可能错了..

您可以构建一个执行此操作的函数:

library(shiny)

myui <- basicPage(  textOutput('var'))
myserver <- shinyServer(function(input, output, session){

  omega <<- 0
  update_data <- function(){omega <<- omega + 1}

  output$var <- renderText({
    invalidateLater(1000, session)
    update_data()})
})

shinyApp(ui = myui, server = myserver)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM