I have defined a custom function, like this:
my.fun = function() {
for (i in 1:1000) {
...
for (j in 1:20) {
...
}
}
If you replace replicate
with rlply from the plyr
package, you can use do.call
with rbind
:
library(plyr)
do.call(rbind, rlply(5, my.fun()))
If you'd rather not rely on the plyr
package, you can always do:
do.call(rbind, lapply(1:5, function(i) my.fun()))
As is stands you probably have an array with three dimensions. If you wanted to have a list you would have added simplify=FALSE. Try this:
do.call( rbind, replicate(5, my.fun(), simplify=FALSE ) )
Or you can use aperm
in the case where "final" is still an array:
fun <- function() matrix(1:10, 2,5)
final <- replicate( 2, fun() )
> final
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
> t( matrix(aperm(final, c(2,1,3)), 5,4) )
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
[3,] 1 3 5 7 9
[4,] 2 4 6 8 10
There may be more economical matrix operations. I just haven't discovered one yet.
Depends on which package you use for parallel computing, but here's how I would do it (hide it in a loop using sapply
, just like replicate
).
library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
# sfExport() #export appropriate objects that will be needed inside a function, if applicable
# sfLibrary() #call to any special library
out <- sfSapply(1:5, fun = my.fun, simplify = FALSE)
sfStop()
Try this:
final <- replicate(5, my.fun(), simplify = "matrix")
You will get the result of 'final' in the form of matrix.