如何记住"在Shiny中使用reactiveTimer时上一次迭代的信息?

时间:2016-07-11 16:24:56

标签: r shiny

我正在尝试(作为一个简单的例子)制作一个Shiny应用程序,该应用程序使用reactiveTimer()定位其坐标定期更新的单个点。这就是我所拥有的:

library(shiny)
library(ggplot2)


server <- shinyServer(function(input, output, session) {
            autoInvalidate <- reactiveTimer(4000, session)

            output$myplot <- renderPlot({
             autoInvalidate()
             coords_curr <- as.data.frame(t((runif(2))))

             ggplot(coords_curr, aes(V1,V2)) + 
              geom_point() +
              xlim(0,1) + ylim(0,1) 
           })
         })

ui <- shinyUI(fluidPage(
       mainPanel(plotOutput("myplot"))
      ))


shinyApp(ui, server)

有没有办法让这个迭代的坐标取决于前一次迭代的坐标?所以,例如,我希望有类似的东西:

coords_curr <- coords_prev + as.data.frame(t((runif(2, min=0, max=0.25))))

其中coords_prev是上一次迭代的coords_curr。有没有办法保存上一次迭代的信息?

谢谢!

2 个答案:

答案 0 :(得分:3)

这样做的一种方法是使用全局赋值运算符<<-

rm(list = ls())
library(shiny)
library(ggplot2)

server <- shinyServer(function(input, output, session) {
  autoInvalidate <- reactiveTimer(500, session)
  # Initiate the values
  coords_prev  <<- 0

  output$myplot <- renderPlot({
    autoInvalidate()
    coords_curr <- coords_prev  + as.data.frame(t((runif(2, min=0, max=0.25))))
    # Add previous value to it
    coords_prev <<- coords_curr
    ggplot(coords_curr, aes(V1,V2))+ geom_point() + xlim(0,1) + ylim(0,1) 
  })
})

ui <- fluidPage(mainPanel(plotOutput("myplot")))
shinyApp(ui, server)

答案 1 :(得分:1)

您可以使用reactiveValues

library(shiny)
library(ggplot2)
server <- shinyServer(function(input, output, session) {
  autoInvalidate <- reactiveTimer(500, session)

  myReactives  <- reactiveValues(myCords = c(0,0))

  output$myplot <- renderPlot({

    autoInvalidate()
    coords_curr <- isolate({
      myReactives$myCords  + as.data.frame(t((runif(2, min=0, max=0.25))))
    })
    # Add previous value to it
    myReactives$myCords <- coords_curr
    ggplot(coords_curr, aes(V1,V2))+ geom_point() + xlim(0,1) + ylim(0,1) 
  })
})

ui <- fluidPage(mainPanel(plotOutput("myplot")))
shinyApp(ui, server)