如何在闪亮的多个模块和应用程序中更新进度条?

如何解决如何在闪亮的多个模块和应用程序中更新进度条?

嗨,我是R编程的新手。 目前,我正在仪表板上创建一些数据并显示它们。 这个项目很快就变得很大,所以我正在尝试将仪表板模块化。 那给我带来了一些问题。一个就是这个Multiple tabItems in one shiny module。 我想要/需要为用户提供进度条的另一个原因是,数据处理需要花费相当长的时间。 现在,像下面的示例一样,这种数据处理分为多个模块。 但是标准栏不会比第一个模块进一步更新。 我的猜测是ID不匹配,因此找不到以下更新。 我没有任何想法来“隔离” updateProgressBar()的ID并将其传递给模块。 非常感谢您的帮助!

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)

#module_1
module_1_ui <- function(id){
  ns <- NS(id)
  
  tagList(
    boxPlus(
      title = "some title",textOutput(ns("some_output"))
    )
  )
  
}

module_1_server <- function(id,see){
  moduleServer(
    id,function(input,output,session){
      ns <- session$ns
      
      observe({
        progressSweetAlert(
          id = ns("progress"),session = session,value = 1,total = 4,)
        Sys.sleep(1) #dummy for some functions that take some time to process
        
        updateProgressBar(
          id = ns("progress"),value = 2,total = 4
        )
        
      })
      
      output$some_output <- renderText({
        see
      })
    }
  )
}


#module_1
module_2_ui <- function(id){
  ns <- NS(id)
  
  tagList(
    boxPlus(
      title = "some title",textOutput(ns("some_output"))
    )
  )
  
}

module_2_server <- function(id,session){
      ns <- session$ns
      
      observe({
        updateProgressBar(
          session = session,id = ns("progress"),value = 3,total = 4
        )
        
        Sys.sleep(4) #dummy for some functions that take some time to process
        
        updateProgressBar(
          session = session,value = 4,total = 4
        )
        
        Sys.sleep(2)
        
        closeSweetAlert(session = session) 
        
      })
      
      output$some_output <- renderText({
        see
      })
      
      
    }
  )
}


#app

ui <- dashboardPagePlus(
  header = dashboardHeaderPlus(
    title = "dummy app"
  ),sidebar = dashboardSidebar(
    sidebarMenu(
      menuItem(
        text = "home",tabName = "home"
      ),menuItem(
        text = "module_1",tabName = "tab_1"
      ),menuItem(
        text = "module_2",tabName = "tab_2"
      ),menuItem(
        text = "some other tabItems",tabName = "some_other_tabItems"
      )
    )
  ),body = dashboardBody(
    tabItems(
      tabItem(
        tabName = "home",box(
          title = "home of the app",width = "auto"
        )
      ),tabItem(
        tabName = "tab_1",module_1_ui(
          id = "module_1"
        )
      ),tabItem(
        tabName = "tab_2",module_2_ui(
          id = "module_2"
        )
      ),tabItem(
        tabName = "some_other_tabItems",box(
          title = "some other content"
        )
      )
    )
  )
)

server <- function(input,output){
  module_1_server(
    id = "module_1",see = "something happens here"
  )
  module_2_server(
    id = "module_2",see = "something happens here as well"
  )
}

shinyApp(ui,server)

解决方法

我会将进度更新推送到主应用程序,然后让模块简单地通知主应用程序它应该更新进度条。由于您的代码尚不清楚模块是如何(按顺序)执行工作的,以及第一个模块的执行方式如何,我作了一些假设:

  1. 代码专家首先按下开始按钮。
  2. 第一个模块仅执行一次更新。完成后,它会通知第二个模块开始。
  3. 第二个模块在第一个模块完成后启动,并执行3个步骤。
library(shiny)
library(shinyWidgets)
library(shinydashboard)
library(shinydashboardPlus)

m1_ui <- function(id) {
   ns <- NS(id)
   boxPlus(
      title = "Module 1",textOutput(ns("text_output"))
   )
}

m1_server <- function(id,content,start) {
   moduleServer(id,function(input,output,session) {
                   trigger_update <- reactiveVal(0)
                   finished       <- reactiveVal(FALSE)
                   
                   observeEvent(start(),{
                      Sys.sleep(1)
                      trigger_update(trigger_update() + 1)
                      finished(rnorm(1))
                   },ignoreInit = TRUE)
                   
                   output$text_output <- renderText(content)
                   
                   list(trigger_update = trigger_update,finished       = finished)
                })
   
}

m2_ui <- function(id) {
   ns <- NS(id)
   boxPlus(
      title = "Module 2",textOutput(ns("text_output"))
   )
}

m2_server <- function(id,session) {
                   trigger_update    <- reactiveVal(0)
                   trigger_next_step <- reactiveVal(0)
                   finished          <- reactiveVal(FALSE)
                   
                   observeEvent(start(),{
                      Sys.sleep(1)
                      trigger_update(trigger_update() + 1)
                      trigger_next_step(1)
                   },ignoreInit = TRUE)
                   
                   observeEvent(trigger_next_step(),{
                      Sys.sleep(1)
                      trigger_update(trigger_update() + 1)
                      if (trigger_next_step() <= 2) {
                         trigger_next_step(trigger_next_step() + 1)
                      } else {
                         finished(TRUE)
                      }
                   },ignoreInit = TRUE
                   )
                   
                   output$text_output <- renderText(content)
                   
                   list(trigger_update = trigger_update,finished       = finished)
                })
}

ui <- dashboardPagePlus(
   dashboardHeaderPlus(
      title = "dummy app"
   ),dashboardSidebar(),dashboardBody(fluidRow(actionButton("start","Start")),fluidRow(m1_ui("m1"),m2_ui("m2")))
)

server <- function(input,session) {
   m1_handler <- m1_server("m1","text 1",reactive(input$start))
   m2_handler <- m2_server("m2","text 2",m1_handler$finished)
   
   current_status <- reactiveVal(0)
   
   observeEvent({
      m1_handler$trigger_update()
      m2_handler$trigger_update()
   },{
      current_status(current_status() + 1)
      print(paste("Update",current_status()))
   },ignoreInit = TRUE
   )
   
   observeEvent(input$start,{
      progressSweetAlert(
         id = "progress",session = session,value = 0,total = 4,)
   }
   )
   
   observe({
      req(current_status() > 0)
      if (current_status() < 5) {
         updateProgressBar(session,"progress",value = current_status(),total = 4)
      } else {
         current_status(0)
         closeSweetAlert(session)
      }
   })
   
}

shinyApp(ui,server)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-