我该如何在shiny中的反应式表达式中使用先前的反应式值?

3
我的响应式表达式生成一个数字向量。有没有办法保存先前呈现的值,并在下一次重复使用它?我尝试创建一个额外的响应式表达式来保存这些值,然后在使用第一个响应式表达式时再次调用它,但这会导致以下错误:
Error in : evaluation nested too deeply: infinite recursion / options(expressions=)?

由于我的示例是调查,有些保密,我不能上传整个示例。但我想给出一些关于我的 server.R 文件的见解。

yvals     <- reactive({...})

xvals     <- c(...) #some default values to start with

xvals     <- reactive({
             dat <- data.frame(xvals(), yvals())
             ....
             print(xvals)
             })

问题在于yvals基于ui.R的输入。然而,xvals并不是(至少不是直接的)。因此,当xvals更新时,它应该将旧/之前的值作为输入。很抱歉我搞得这么乱——我知道没有可再现的例子很难帮助我。但基本上,我只想修复以前的反应结果,并在下一次重用它。

请提供一个你想要实现的例子。请参考以下帖子,了解如何提供可重现的示例:https://dev59.com/eG025IYBdhLWcg3whGSx。 - lmo
1
可能是当一个响应式对象改变时,我能保存旧值吗?的重复问题。 - John Paul
1
我认为你正在寻找'reactiveValues',但在回答之前我想看看你的可重现示例。 - Pete900
1个回答

4

有点晚,但我认为这是你想要的 - 这是一个很好的练习。它使用一个反应性变量memory来跟踪从一个迭代到下一个迭代。请注意,isolate表达式避免了递归错误。

library(shiny)

ui <- fluidPage(
  h1("Reactive Memory"),
  sidebarLayout(
    sidebarPanel(
      numericInput("val","Next Value",10)
    ),
    mainPanel(
      verbatimTextOutput("prtxval")
    )
))
server <- function(input,output,session) {

  nrowsin <- 6
  ini_xvals <- 1:nrowsin

  memory <- reactiveValues(dat = NULL)
  yvals <- reactive({ rep(input$val,nrowsin) })

  xvals <- reactive({

    isolate(dat <- memory$dat)
    if (is.null(dat)) {
      memory$dat <- data.frame(xvals = ini_xvals,yvals())
    } else {
      memory$dat <- data.frame(dat,yvals())
    }
    return(memory$dat)
  })

  output$prtxval <- renderPrint({ xvals() })
}
shinyApp(ui,server)

图片:

这里输入图片描述


这是一张关于IT技术的图片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接