Возможно ли для `lapply` возвращать результаты частичной обработки с ограничением по времени ожидания? - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть код, выполнение которого занимает много времени.Поэтому я использую R.util withTimeout.Синтаксис выглядит так:

res <- withTimeout({
  v1 %>% mutate(Output = unlist(lapply(as.list(data.frame(t(v1))),function(x) 
  SomeFunction(x))))
}, timeout = 2, onTimeout = "warning")

В моем коде v1 - это фрейм данных со многими строками, и функция работает по строкам (используя lapply).Я позволяю функции работать в течение 2 секунд, и если это займет больше времени, выдает предупреждение.Однако уже выполненный вывод, кажется, нигде не был сохранен!Как мне изменить код так, чтобы возвращался сам вывод, а также предупреждение?

1 Ответ

0 голосов
/ 15 сентября 2018

Из любопытства я попробовал следующее, и, похоже, это хорошо работает.

## an example data frame of 1000 columns
## `lapply` will loop a function over it column by column
x <- data.frame(matrix(sample.int(2, 2 * 1000, TRUE), 2, 1000))

## actually a wrapper function of your `SomeFunction`
## it takes an additional `time_limit` (in seconds)
## is also access a GLOBAL variable `elapsed_time`
f <- function (x, time_limit) {
  if (elapsed_time < time_limit) {
    t1 <- proc.time()[[3]]
    z <- tabulate(sample(x, 1e+5, TRUE))  ## an arbitrary example function here
    t2 <- proc.time()[[3]]
    elapsed_time <<- elapsed_time + (t2 - t1)  ## note the `<<-`
    } else {
    z <- NULL
    }
  z
  }

elapsed_time <- 0                  ## elapsed time counter (in global environment)
oo <- lapply(x, f, time_limit = 2) ## 2 seconds time limit

elapsed_time
#[1] 2.002

sum(sapply(oo, is.null))
#[1] 693

Итак, на моем ноутбуке итерация заканчивается после (1000 - 693) = 307 раундов. lapply по-прежнему возвращает список длины 1000, но только первые 307 элементов содержат результат обработки, а остальные 693 записи - NULL.

На самом деле, это хороший пример, где <<- было бы полезно.

...