gpt4 book ai didi

r - 来自全局变量的 Shiny 进度条

转载 作者:行者123 更新时间:2023-12-04 16:03:41 24 4
gpt4 key购买 nike

我有一个带有自定义函数的库,我需要在一个 Shiny 的应用程序中使用一个。此函数内部有一个 for 循环,我想在该循环中使用变量来更新进度条(而不是将函数复制到服务器文件,因为我想保持一切独立和干净)。到目前为止,我已经设法在使用“withProgress()”运行函数时弹出一条消息,但我想让它更好地显示已完成工作的百分比,因此最终用户不会'垃圾邮件运行按钮。这是问题的可重现示例:

library(shiny)

# Library in separate file
snail_function <- function(){
for (i in 1:100){
Sys.sleep(1)
}
}

# ui.R
ui <- shinyUI(fluidPage(
tabsetPanel(
tabPanel("1. Load Files"
, fluidRow(actionButton("analysis", "Run analysis"))
, fluidRow(
plotOutput("bar")
)
)

)
))

# server.R
server <- shinyServer(function(input, output, session) {
observeEvent(input$analysis, {
output$bar <- renderPlot({
withProgress(message = 'Running... (this may take a while)',
detail = 'Go get some coffee...', value = 0, {
snail_function()
})
# do stuff
})

})

})

shinyApp(ui = ui, server = server)

所以,我想问题是:有没有什么方法可以使用 snail_function 循环中的 i 来设置进度条中的进度? (使用全局变量或类似的东西)
谢谢!

最佳答案

保持它干净的解决方案的一种可能性是向函数添加参数 progress,指示我们是否要增加进度,并且仅在以下情况下调用 incProgress这被设置为 TRUE。所以当我们想独立运行这个函数时,我们可以将它称为snail_function(FALSE)。下面显示了一个工作示例,希望对您有所帮助。


enter image description here

library(shiny)

# Library in separate file
snail_function <- function(progress=FALSE){
for (i in 1:100){
Sys.sleep(1)
if(progress)
incProgress(1/100)
}
}

# ui.R
ui <- shinyUI(fluidPage(
tabsetPanel(
tabPanel("1. Load Files"
, fluidRow(actionButton("analysis", "Run analysis"))
, fluidRow(
plotOutput("bar")
)
)

)
))

# server.R
server <- shinyServer(function(input, output, session) {
observeEvent(input$analysis, {
output$bar <- renderPlot({
withProgress(message = 'Running... (this may take a while)',
detail = 'Go get some coffee...', value = 0, {
snail_function(progress=TRUE)
})
# do stuff
})

})

})

shinyApp(ui,server)

关于r - 来自全局变量的 Shiny 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com