情节中的暂停循环-闪亮

时间:2018-11-29 22:14:24

标签: r shiny

我必须使用Shiny构建一个简单的Web应用程序,在该应用程序中,我需要在顺序计算的每次迭代中进行绘制。使用this post,我可以做到。

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

在遍历代码时,我无法理解为什么pause_value()为true时观察会运行。我添加了一些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)

我已经尝试使我的应用程序运行2天了。即使在这个简单的例子中,我也无法弄清楚问题所在。

我希望有人能提供帮助。

我的会话信息:

R version 3.5.0 (2018-04-23)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS  10.14.1

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.5/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] shiny_1.2.0

loaded via a namespace (and not attached):
 [1] compiler_3.5.0  magrittr_1.5    R6_2.3.0        promises_1.0.1  later_0.7.5    
 [6] htmltools_0.3.6 tools_3.5.0     Rcpp_0.12.19    jsonlite_1.5    digest_0.6.18  
[11] xtable_1.8-3    httpuv_1.4.5    mime_0.6        packrat_0.4.9-2 rlang_0.3.0.1  

欢呼

1 个答案:

答案 0 :(得分:1)

请考虑使用以下方法,使用timer()控制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)