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