Как я могу посчитать серийный номер вектора внутри лапы? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть большой vactor (3 ГБ) для обработки через лапу, и я хотел бы знать, сколько это произошло. Будет проще, если я смогу определить, какой это элемент, но что, если я не смогу?

В цикле for я могу назначить счетчик внутри цикла, но как мне сделать, чтобы установитьсчетчик внутри lapply?

X <- LETTERS[1:26]

lapply(X, function(a) {
  cat(paste0(which(X == a), "\r")
  print(a)
})

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Чтобы свернуть свой собственный счетчик прогресса, просто итерируйте по целым позициям X вместо того, чтобы итерировать по элементам X напрямую. В следующих процентах печатается обработанный процент:

X_out <- lapply(seq_along(X), function(a) {
    cat("\r", round((a/length(X))*100), "%", sep = "")
    toupper(X[a])
})

Вы также можете попробовать пакет progress. Единственным недостатком является то, что он, кажется, немного тормозит (возможно, из-за дизайна, чтобы вы могли видеть прогресс). Вы можете попробовать что-то вроде этого:

install.packages("progress")
library(progress)

X <- sample(letters, 100000, T)

pb <- progress_bar$new(total = length(X))

X_out <- lapply(X, function(a) {
    pb$tick()
    toupper(a)
})
0 голосов
/ 03 ноября 2019

Итерация по индексам, а не по вектору:

X <- LETTERS
f <- function(i) {
  if (i %% 10 == 0) cat("X[", i, "] =", X[i], "\n")
  X[i]
}
result <- lapply(seq_along(X), f)

выдача этого вывода на консоль R (а также установка result):

X[ 10 ] = J 
X[ 20 ] = T 

Итерация поочереднопо индексу и вектору:

f2 <- function(i, x) {
  if (i %% 10 == 0) cat("X[", i, "] =", x, "\n")
  x
}
result2 <- Map(f2, seq_along(X), X)
...