R 在绘图中暂停循环-闪亮

R 在绘图中暂停循环-闪亮,r,shiny,R,Shiny,我必须使用Shiny构建一个简单的web应用程序,我需要在顺序计算的每次迭代中绘制一个图。用我的电脑我可以做到这一点 现在我想要的是能够通过点击停止循环过程。动作按钮应该像暂停/播放按钮一样工作,但我无法使其按预期工作 当浏览代码时,我不明白为什么在pause\u value()为真时运行observe。我添加了一些print,以查看实际执行的操作和时间。代码如下: library(shiny) server <- function(input, output, session) {

我必须使用Shiny构建一个简单的web应用程序,我需要在顺序计算的每次迭代中绘制一个图。用我的电脑我可以做到这一点

现在我想要的是能够通过点击停止循环过程。动作按钮应该像暂停/播放按钮一样工作,但我无法使其按预期工作

当浏览代码时,我不明白为什么在
pause\u value()
为真时运行observe。我添加了一些
print
,以查看实际执行的操作和时间。代码如下:

library(shiny)

server <- function(input, output, session) {
  rv <- reactiveValues(i = 0)
  maxIter <- 10

  output$myplot <- renderPlot( {
    if(rv$i > 0) {
      x <- seq_len(rv$i * 100)
      y <- (x + 1)^2 - 1 # this will do for now
      plot(x, y, main = sprintf("Round %i", rv$i), type = "l")
    } else {
      plot(1:1, main = "Placeholder")
    }
  })

  pause_value <- reactive({
    if (input$run %% 2 == 0) {
      TRUE
    } else {
      FALSE
    }
  }
  )

  observeEvent(
    eventExpr = pause_value(),
    handlerExpr = {
      if (pause_value()) {
        updateActionButton(
          session,
          inputId = "run",
          label = "RUN"
        )
      } else {
        updateActionButton(
          session,
          inputId = "run",
          label = "STOP"
        )
      }
    }
  )

  observeEvent(
    eventExpr = {
      input$run
      pause_value()
    },
    ignoreNULL = FALSE,
    ignoreInit = TRUE,
    handlerExpr = {
      print(pause_value())
      if (!pause_value()) {
        rv$i <- 0
        observe({
          print("-----")
          isolate({
            rv$i <- rv$i + 1
          })
          if (isolate(rv$i) < maxIter){
            invalidateLater(2000, session)
          }
        })
      } else {
        print("=====")
      }
    })
}

ui <- fluidPage(
  actionButton("run", "RUN"),
  plotOutput("myplot")
)

shinyApp(ui = ui, server = server)

欢呼

考虑以下方法,使用
定时器()
控制
rv$go
变量的值(该变量反过来控制
rv$i
是否会增加):

library(shiny)

server <- function(input, output, session) {
  rv <- reactiveValues(i = 0, go = F)
  maxIter <- 10
  timer <- reactiveTimer(2000)

  output$myplot <- renderPlot({
    if(rv$i > 0) {
      x <- seq_len(rv$i * 100)
      y <- (x + 1)^2 - 1 # this will do for now
      plot(x, y, main = sprintf("Round %i", rv$i), type = "l")
    } else {
      plot(1:1, main = "Placeholder")
    }
  })

  observeEvent(input$run, {
    rv$go <- !rv$go

    updateActionButton(
      session,
      inputId = "run",
      label = "STOP"
    )
  })

  observeEvent(timer(), {
    req(rv$i < maxIter)
    req(rv$go)
    rv$i <- rv$i + 1
  })
}

ui <- fluidPage(
  actionButton("run", "RUN"),
  plotOutput("myplot")
)

shinyApp(ui = ui, server = server)
库(闪亮)
服务器
library(shiny)

server <- function(input, output, session) {
  rv <- reactiveValues(i = 0, go = F)
  maxIter <- 10
  timer <- reactiveTimer(2000)

  output$myplot <- renderPlot({
    if(rv$i > 0) {
      x <- seq_len(rv$i * 100)
      y <- (x + 1)^2 - 1 # this will do for now
      plot(x, y, main = sprintf("Round %i", rv$i), type = "l")
    } else {
      plot(1:1, main = "Placeholder")
    }
  })

  observeEvent(input$run, {
    rv$go <- !rv$go

    updateActionButton(
      session,
      inputId = "run",
      label = "STOP"
    )
  })

  observeEvent(timer(), {
    req(rv$i < maxIter)
    req(rv$go)
    rv$i <- rv$i + 1
  })
}

ui <- fluidPage(
  actionButton("run", "RUN"),
  plotOutput("myplot")
)

shinyApp(ui = ui, server = server)