Из любопытства я попробовал следующее, и, похоже, это хорошо работает.
## 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
.
На самом деле, это хороший пример, где <<-
было бы полезно.