在Shiny R Studio中重置动画

use*_*781 5 animation r reset shiny

我正在使用R Studio的Shiny构建一个动画图形项目.目前"去!" 按钮启动动画.我想让"重置"按钮重新初始化变量并重新运行动画,但由于Shiny不允许对输入$按钮值进行代码内更改,因此我不知道如何执行此操作.真实的项目在形式上与下面的样本块类似,但涉及的更多.动画是传达信息的组成部分.当项目完成后,我打算将它部署在Shiny服务器上,因此我希望用户能够使用不同的选择重新运行动画,而无需重新打开链接.

    #  ui.R
library(shiny)

shinyUI(fluidPage(

  # Application title
  headerPanel("Cost Explorer"),


  sidebarPanel(
    actionButton("goButton", "Go!"),
    actionButton("reset", "Reset"),

    sliderInput("myvar", label=h6("Variability of cost"),
                min=0, max=50, value=10)   
  ),

  mainPanel(

    plotOutput(outputId="tsplot")

  )
))

    # server.R
library(shiny)

shinyServer(function(input, output, session) {

  # initialize reactive values
  ts <- reactiveValues(cost=rep(NA,100), year=(2010:2109), counter=1)

  output$tsplot <- renderPlot({
    plot(ts$year, ts$cost, xlim=c(2010,2110), ylim=c(-200,200), xlab="Year",
         ylab="Cost (US Dollars)", type="l", main="Forecasted Cost Time series")
  })

  observe({

    isolate({


        if (ts$counter==1){
          ts$cost[ts$counter]=50 #initial cost
        }
        if (ts$counter > 1){
          ts$cost[ts$counter]=ts$cost[ts$counter-1]+rnorm(1,0,input$myvar)
        }
        ts$counter=ts$counter+1

    })

    if (((isolate(ts$counter) < 100)) & (input$goButton > 0)){
      invalidateLater(200, session)
    }
    if (input$reset > 0){
      # How do I add reset functionality?

    }
  }) 
})
Run Code Online (Sandbox Code Playgroud)

Por*_*hop 3

observe根据您的应用程序,使用全局赋值运算符添加另一个并将计数器重置为 1会更快<<-。我还更改了绘图,因此它绘制了索引变量。看看人们遇到的类似问题,在这里。注意:在我的一些应用程序中,当用户按两次开始按钮时,我也有暂停按钮,您可以通过检查按钮索引是否可被 2 整除来实现此目的,因为每次单击按钮时,它都会增加 1。

我正在进一步研究您的应用程序,确保您正在垃圾收集未引用的观察者,因为您可能会耗尽内存(通过任务管理器查看内存配置文件)。在这里查看这个示例,或者您可以为每个会话设置注销功能,客户端将在n分钟后注销。

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

ui <- (fluidPage(
  # Application title
  headerPanel("Cost Explorer"),

  sidebarPanel(
    actionButton("goButton", "Go!"),
    actionButton("reset", "Reset"),
    sliderInput("myvar", label=h6("Variability of cost"),min=0, max=50, value=10)   
  ),
  mainPanel(plotOutput(outputId="tsplot"))
))

server <- (function(input, output, session) {

  # initialize reactive values
  ts <- reactiveValues(cost=rep(NA,100), year=(2010:2109), counter=1)

  output$tsplot <- renderPlot({
    plot(ts$year[1:ts$counter], ts$cost[1:ts$counter], xlim=c(2010,2110), ylim=c(-200,200), xlab="Year",
         ylab="Cost (US Dollars)", type="l", main="Forecasted Cost Time series")
  })

  observe({
    isolate({
      if (ts$counter==1){
        ts$cost[ts$counter]=50 #initial cost
      }
      if (ts$counter > 1){
        ts$cost[ts$counter]=ts$cost[ts$counter-1]+rnorm(1,0,input$myvar)
      }
      ts$counter=ts$counter+1    
    })
    if (((isolate(ts$counter) < 100)) & (input$goButton > 0)){
      invalidateLater(200, session)
    }

  })

  observe({
    if (input$reset > 0){
      ts$counter <<- 1
    }
  })
})

runApp(list(ui = ui, server = server))
Run Code Online (Sandbox Code Playgroud)