在循环中更新无功值

问题描述 投票:0回答:1

我有一个反应性 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)
r shiny
1个回答
0
投票

使用软件包 futureipc:

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)
© www.soinside.com 2019 - 2024. All rights reserved.