我必须使用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
欢呼
答案 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)