首页 > 解决方案 > R Shiny 我如何在函数内更新ProgressBar?

问题描述

我是新来的,如有错误请见谅。

我有以下代码工作:

library(shinydashboard)
library(shinyWidgets)

#### Header ####
header <- dashboardHeader()

#### Sidebar ####
sidebar <- dashboardSidebar()

#### Body ####
body <- dashboardBody(
  actionButton("go", label = "Go!"),
  # Loading Bar
  progressBar("progress", value=0, total=100, title="", display_pct = TRUE)
)

ui = dashboardPage(header, sidebar, body)

#### Server ####
server <- function(input, output, session){
  observeEvent(input$go,{
    for(i in 1:13){
      updateProgressBar(
        session = session,
        id = "progress",
        value = i,
        total = 13,
        title = paste("Progress ", i, "/", 13)
      )
      Sys.sleep(0.2)
    }
    }
  )
}

shinyApp(ui, server)

但是现在我需要通过已经定义的函数中的一些代码来更新progressBar(实际上是在源代码中)。作为我定义的测试:

test_func <- function(){
  for(i in 1:13){
    updateProgressBar(
      session = session,
      id = "progress",
      value = i,
      total = 13,
      title = paste("Progress ", i, "/", 13)
    )
    Sys.sleep(0.2)
  }
}

并将服务器编辑为:

#### Server ####
server <- function(input, output, session){
  observeEvent(input$go,{
    test_func()
    }
  )
}

我收到以下错误:“对象类型闭包不是子集”

我怎样才能以正确的方式做到这一点?提前致谢。

标签: rshinyshinywidgetsr-environment

解决方案


您的问题似乎与环境有关。

当我在服务器函数test_func 之外定义时,我得到一个错误(与你的不同) 。当我在服务器函数中定义它时我得到了预期的行为。您可以在服务器功能中获取外部文件吗?

如果不是,session则作为参数传递给test_func. 当我这样做并test_func 在服务器功能之外定义时,一切都按预期工作。


推荐阅读