我正在尝试(作为一个简单的例子)制作一个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
。有没有办法保存上一次迭代的信息?
谢谢!
答案 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)