Можно ли сохранить память при использовании apply ()? - PullRequest
0 голосов
/ 30 марта 2020

Мне нужно запустить функцию lapply в activation_status списке t раз, чтобы итерация t функции запоминала результаты итерации t-1.

Список в основном это двумерный массив, представляющий статус одного элемента i в течение нескольких периодов t, который выглядит следующим образом:

n_items <<- 100
n_iterations <<- 10

activation_status <- 
  lapply(1:n_iterations, 
         FUN = function(t, bool, i) rep(bool, t), 
         FALSE, n_items)

Теперь во время каждой итерации t я случайным образом активируюсь (установите на TRUE ) количество элементов в списке, но я хочу, чтобы все элементы, уже активированные во время t -1, оставались активными (обратите внимание, что я определяю activation_status в функции update, чтобы она была доступна во внутренних функциях).

updateActivation <- function(t) {
  activation_status[[t]] <- as.logical(rbinom(n_items, 1, prob = .5))
  activation_status[[t]][activation_status[[t-1]] == TRUE] <- TRUE
}

Но затем

lapply(1:n_iterations, updateActivation)

выдает ошибку:

Ошибка в Activation_status [[t - 1]]: попытка выбрать менее одного элемент в get1index

Я знаю, что могу использовать al oop, но мне интересно, если это так:

  1. Можно сделать что-то подобное с помощью функции apply ?
  2. сделать это быстрее?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Не уверен, что я полностью понял вопрос, но похоже, что вы ищете рекурсию.
В этом случае вместо lapply() можно использовать Reduce():

activation_status <- rep(FALSE, 10)
n_iterations      <- 5
Reduce(function(y, x) as.logical(rbinom(length(y), 1, prob=0.1)) | y,
       x=1:n_iterations, init=activation_status, accumulate=TRUE
       )

[[1]]                                                           
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

[[2]]                                                           
 [1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

[[3]]                                                           
 [1] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE

[[4]]                                                           
 [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

[[5]]                                                           
 [1]  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

[[6]]                                                           
 [1]  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
0 голосов
/ 30 марта 2020

Вероятно, мы могли бы сделать это без использования команды apply.

#Set seed for reproduciblity
set.seed(123)
#Create initialization demo data
activation_status <- rep(FALSE, 10)
#Number of values to select
n_iterations <- 5
#Sequence from 1:n_iterations
seq_n_iterations <- seq_len(n_iterations)
#Create matrix to hold output
output <- replicate(n_iterations, activation_status)
#Select n_iterations random values from 1:length(activation_status)
#You can change this if you want to use some specific distrubution
points <- sample(length(activation_status), n_iterations)
#Create column indices
cols <- rep(seq_n_iterations, seq_n_iterations)
#Create row indices
rows <- points[ave(inds, inds, FUN = seq_along)]
#Change those values to TRUE
output[cbind(rows, cols)] <- TRUE

output
#       [,1]  [,2]  [,3]  [,4]  [,5]
# [1,] FALSE FALSE FALSE FALSE FALSE
# [2,] FALSE FALSE  TRUE  TRUE  TRUE
# [3,]  TRUE  TRUE  TRUE  TRUE  TRUE
# [4,] FALSE FALSE FALSE FALSE FALSE
# [5,] FALSE FALSE FALSE FALSE FALSE
# [6,] FALSE FALSE FALSE FALSE  TRUE
# [7,] FALSE FALSE FALSE FALSE FALSE
# [8,] FALSE FALSE FALSE  TRUE  TRUE
# [9,] FALSE FALSE FALSE FALSE FALSE
#[10,] FALSE  TRUE  TRUE  TRUE  TRUE

Если вы хотите, чтобы они были списками:

asplit(output, 2)

#[[1]]
# [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

#[[2]]
# [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

#[[3]]
# [1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

#[[4]]
# [1] FALSE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE

#[[5]]
# [1] FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE
...