Индикатор выполнения для функции внутри функции в блестящем - PullRequest
0 голосов
/ 09 октября 2019

У меня есть функция из пакета, которая выполняет ряд других функций внутри него. Я хотел бы показать каждую из этих функций как отдельный индикатор выполнения по мере их запуска. Возможно ли это?

Я использовал withProgress, но это показывает только «внешнюю» функцию и не показывает ход выполнения функций, которые в ней выполняются.

1 Ответ

1 голос
/ 09 октября 2019

Добро пожаловать в SO, в следующий раз попробуйте предоставить минимальный пример . Я использую статью Индикатор прогресса , предоставленную Rstudio, в качестве основы, чтобы ответить вам.

Если я правильно понял, у вас возникли проблемы с использованием withProgress с вложенными функциями. Вы можете использовать withProgress внутри этих функций:

library(shiny)

fun2 <- function(i,n,dat) {
  dat <- rbind(dat, data.frame(x = rnorm(1), y = rnorm(1)))
  incProgress(1/n, detail = paste("Doing part", i))
  Sys.sleep(0.1)
  return(dat)
}

fun1 <- function(n) {
  dat <- data.frame(x = numeric(0), y = numeric(0))
  for (i in 1:n) { dat <- fun2(i,n,dat) }
  return(dat)
}

server <- function(input, output) {
  output$plot <- renderPlot({
    input$goPlot # Re-run when button is clicked
    withProgress(message = 'Making plot', value = 0, {
      n <- 10
      dat <- fun1(n)
    })
    plot(dat$x, dat$y)
  })
}

ui <- shinyUI(basicPage(
  plotOutput('plot', width = "300px", height = "300px"),
  actionButton('goPlot', 'Go plot')
))

shinyApp(ui = ui, server = server)

Другим решением будет использование глобальных переменных (просто не забывайте соблюдать осторожность при использовании глобальных переменных).

library(shiny)
nprogress <- 10
iprogress <- 0

fun2 <- function(dat) {
  dat <- rbind(dat, data.frame(x = rnorm(1), y = rnorm(1)))
  incProgress(1/nprogress, detail = paste("Doing part", iprogress))
  Sys.sleep(0.1)
  return(dat)
}

fun1 <- function(n) {
  dat <- data.frame(x = numeric(0), y = numeric(0))
  for (i in 1:n) {
    iprogress <<- i
    dat <- fun2(dat)
  }
  return(dat)
}

server <- function(input, output) {
  output$plot <- renderPlot({
    input$goPlot # Re-run when button is clicked
    withProgress(message = 'Making plot', value = 0, {
      n <- 10
      nprogress <<- n
      dat <- fun1(n)
    })
    plot(dat$x, dat$y)
  })
}

ui <- shinyUI(basicPage(
  plotOutput('plot', width = "300px", height = "300px"),
  actionButton('goPlot', 'Go plot')
))

shinyApp(ui = ui, server = server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...