我有一个反应性 val 变量,需要更新包 shinybusy 中的 进度圆小部件。我有一个函数 f1 ,它将反应变量作为参数。函数 f1 有一个 for 循环,在每次迭代时我想更新 val。
我想知道如何更新循环内的reactiveVal val。
library(shiny); library(shinyBS); library(shinybusy)
f1 <- function(val){
for(i in 1:3){
val(i); cat(paste0(i, "/", 3), "\r"); Sys.sleep(1)
}
}
ui <- fluidPage(titlePanel(""), sidebarLayout( sidebarPanel(), mainPanel(
actionButton("show_modal", "Modal")
)))
# Define server logic required to draw a histogram
server <- function(input, output) {
val <- reactiveVal(0)
observeEvent(input$show_modal,{
showModal(modalDialog(
title = "Modal", "Something",
shinybusy::progress_circle(value = 0, color = "#112446", shiny_id = "circle"), easyClose = TRUE, footer = modalButton("Close") ))
f1(val)
})
observe({ update_progress("circle", val()/3) })
}
# Run the application
shinyApp(ui = ui, server = server)
使用软件包 future 和 ipc:
library(shiny)
library(shinybusy)
library(ipc)
library(future)
library(promises)
plan(multisession)
ui <- fluidPage(
titlePanel(""),
sidebarLayout(
sidebarPanel(),
mainPanel(
actionButton("show_modal", "Modal")
)
)
)
server <- function(input, output, session) {
Value <- reactiveVal(NULL)
queue <- shinyQueue()
queue$consumer$start(100) # Execute signals every 100 milliseconds
observeEvent(input$show_modal,{
showModal(modalDialog(
title = "Modal", "Something",
progress_circle(value = 0, color = "#112446", shiny_id = "circle"),
actionButton("x", "X"),
easyClose = TRUE,
footer = modalButton("Close")
))
future({
for(i in 1:5) {
Sys.sleep(2)
queue$producer$fireAssignReactive("Value", i/5)
}
})
NULL
})
observeEvent(Value(), {
update_progress("circle", Value(), session = session)
})
}
# Run the application
shinyApp(ui = ui, server = server)