gpt4 book ai didi

r - 当应用程序繁忙时如何防止用户在 Shiny 的应用程序上做任何事情

转载 作者:行者123 更新时间:2023-12-04 16:37:09 25 4
gpt4 key购买 nike

我有一个复杂的 Shiny 应用程序,其中包含大量输入、传单 map 等......
我遇到的问题是当应用程序忙于进行一些计算时,用户不断点击应用程序上的任何地方,有时应用程序崩溃。
我想阻止用户在应用程序繁忙时进行任何点击。重要的是,微调器保持微调器而不是像 waiter 那样的整页服务员。包裹。也许有可能将旋转器和服务员结合起来?但我还没有找到方法。
我在这里有一个小的代表:
当我单击“忙碌的应用程序”按钮时,有一个 5 秒的微调器让用户等待。但在此期间,用户仍然可以点击“增量”按钮。在微调器结束时,输出会增加点击次数。
我想立即将整个应用程序阻止给用户,而不仅仅是在应用程序繁忙时在按钮上设置“禁用”(因为我的应用程序中有很多输入,这需要太多修改)

library(shiny)

ui <- fluidPage(

# spinner css
tags$head(
tags$style(HTML("
#loadmessage {
position:fixed; z-index:8; top:50%; left:50%; padding:10px;
text-align:center; font-weight:bold; color:#000000; background-color:#CCFF66;
}

.loader {
position:fixed; z-index:8; border:16px solid #999999;
border-top: 16px solid #8B0000; border-radius: 50%;
width: 120px; height: 120px; top:45%; left:45%;
animation: spin 2s linear infinite;
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}"))
),

# display load spinner when shiny is busy
conditionalPanel(
condition = "$(\'html\').hasClass(\'shiny-busy\')",
tags$div(class = "loader")
),
actionButton(
inputId = "increment",
label = "Increment"
),
textOutput("result"),
actionButton(
inputId = "busy",
label = "Busy app"
)
)

server <- function(input, output, session) {

rv <- reactiveValues(counter = 0)

#increment counter
observeEvent(input$increment,{
rv$counter = rv$counter + 1
})

#display incremented counter
output$result <- renderText({
rv$counter
})

observeEvent(input$busy, {
Sys.sleep(5)
# during this time, the user should not be able to do anything on the app
})
}

shinyApp(ui = ui, server = server)

最佳答案

我们可以尝试使用 shinyjs 禁用所有输入图书馆结合walk功能。

  observeEvent(input$busy, {
names(input) %>% walk(disable)
Sys.sleep(3)
# during this time, the user should not be able to do anything on the app
names(input) %>% walk(enable)
})
}
应用程序:
library(shiny)
library(shinyjs)
library(tidyverse)

ui <- fluidPage(
useShinyjs(),
# spinner css
tags$head(
tags$style(HTML("
#loadmessage {
position:fixed; z-index:8; top:50%; left:50%; padding:10px;
text-align:center; font-weight:bold; color:#000000; background-color:#CCFF66;
}

.loader {
position:fixed; z-index:8; border:16px solid #999999;
border-top: 16px solid #8B0000; border-radius: 50%;
width: 120px; height: 120px; top:45%; left:45%;
animation: spin 2s linear infinite;
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}"))
),

# display load spinner when shiny is busy
conditionalPanel(
condition = "$(\'html\').hasClass(\'shiny-busy\')",
tags$div(class = "loader")
),
actionButton(
inputId = "increment",
label = "Increment"
),
textOutput("result"),
actionButton(
inputId = "busy",
label = "Busy app"
)
)

server <- function(input, output, session) {

rv <- reactiveValues(counter = 0)

#increment counter
observeEvent(input$increment,{
rv$counter = rv$counter + 1
})

#display incremented counter
output$result <- renderText({
rv$counter
})

observeEvent(input$busy, {
names(input) %>% walk(disable)
Sys.sleep(3)
# during this time, the user should not be able to do anything on the app
names(input) %>% walk(enable)
})
}

shinyApp(ui = ui, server = server)

关于r - 当应用程序繁忙时如何防止用户在 Shiny 的应用程序上做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68452272/

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