Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R assign several list elements the same object

I currently have a loop - well actually a loop in loop, in a simulation model which gets slow with larger numbers of individuals. I've vectorised most of it and made it a heck of a lot faster. But there's a part where I assign multiple elements of a list as the same thing, simplifying a big loop to just the task I want to achieve:

new.matrices[[length(new.matrices)+1]]<-old.matrix

With each iteration of the loop the line above is called, and the same matrix object is assigned to the next new element of a list.

I'm trying to vectorize this - if possible, or make it faster than a loop or apply statement.

So far I've tried stuff along the lines of:

indices <- seq(from = length(new.matrices) + 1, to = length(new.matrices) + reps)
new.matrices[indices] <- old.matrix

However this results in the message:

Warning message:
In new.effectors[effectorlength] <- matrix :
  number of items to replace is not a multiple of replacement length

It also tries to assign one value of the old.matrix to one element of new.matrices like so:

[[1]]
[1] 8687

[[2]]
[1] 1

[[3]]
[1] 5486

[[4]]
[1] 0

When the desired result is one list element = one whole matrix, a copy of old.matrix

Is there a way I can vectorize sticking a matrix in list elements without looping? With loops how it is currently implemented we are talking many thousands of repetitions which slows things down considerably, hence my desire to vectorize this if possible.

like image 415
Ward9250 Avatar asked Nov 04 '22 04:11

Ward9250


1 Answers

Probably you already solved your problem, anyway, the issue in your code

new.matrices[indices] <- old.matrix

was caused by trying to replace some objects (the NULL elements in your new.matrices list) with something different, a matrix. So R coerces old.matrix into a vector and tries to stick each single value to a different list element, (that's why you got this result, and when, say, reps is 4 or 8 and old.matrix is NOT a 2 x 2 matrix, you also get the warning). Doing

new.matrices[indices] <- list(old.matrix)

will work, and R will replicate the single element list list(old.matrix) "reps" times automatically.

like image 79
Michele Avatar answered Nov 15 '22 09:11

Michele