У меня есть библиотека с настраиваемыми функциями, и мне нужно использовать ее в блестящем приложении. У этой функции есть цикл 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)
Итак, я предполагаю, что вопрос в том, могу ли я использовать i из цикла snail_function, чтобы установить прогресс на панели? (с глобальной переменной или чем-то в этом роде)
Спасибо!





Одна из возможностей сохранить его чистым решением - это добавить к функции параметр progress, который указывает, хотим ли мы увеличить прогресс, и вызывать incProgress только тогда, когда для него установлено значение TRUE. Поэтому, когда мы хотим запустить эту функцию автономно, мы можем назвать ее snail_function(FALSE). Ниже показан рабочий пример, надеюсь, это поможет.

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)