2017-09-07 1 views
0

Ich habe eine Funktion, die eine Matrix erstellt und ich möchte diese Funktion tausend Mal so aufrufen, dass ich am Ende eine Liste von 1000 Matrizen habe. Hier ein Beispiel:Wie man eine Funktion mehrmals ausführt und die Ergebnisse in eine Liste schreibt?

set.seed(1) 
gen_mat <- function(x) matrix(c(1, 1, 1, x + rnorm(1)), nrow = 2) 

Nun, ich replicate(10, gen_mat(1)) versucht, aber dies gibt einen Array und keine Liste. Wie es geht?

+4

Blick in der Dokumentation für 'replicate':' Replikat (10, gen_mat (1), vereinfacht = FALSE) '' – MrFlick

Antwort

2

base R

n <- 10 
lapply(seq_len(n), gen_mat(1)) 

purrr Paket

library(purrr) 
map(seq_len(n), ~gen_mat(1)) 
3

Kombination von oben Antwort, Kommentar und meine eigene Antwort. Natürlich mag ich meine besser. Auch ich denke, es ist ein Fehler in der obigen Antwort für base R.

n <- 10 

# give 1 to gen_mat n-times 
lapply(rep(1, n), gen_mat) 

# replicate n-times 
replicate(n, gen_mat(1), simplify=FALSE) 

# lapply returns error if FUN is not function or 
# the function is not taking an argument. Hence a dummy function. 
lapply(seq_len(n), function(x) gen_mat(1)) 

microbenchmarking die drei Methoden

ich einen größeren Wert für n verwendet, aber die Ergebnisse sind ähnlich in meinem Desktop mit kleiner n als auch. Dazu dauert replicate länger als die beiden anderen Methoden.

set.seed(1) 
gen_mat <- function(x) matrix(c(1, 1, 1, x + rnorm(1)), nrow = 2) 
n <- 1000 

library(microbenchmark) 
library(ggplot2) 

mb <- microbenchmark(
    lap1 = {lapply(rep(1, n), gen_mat)}, 
    repl = {replicate(n, gen_mat(1), simplify=FALSE)}, 
    lap2 = {lapply(seq_len(n), function(x) gen_mat(1))}, 
    times = 10000L 
) 

mb 
# Unit: milliseconds 
# expr  min  lq  mean median  uq  max neval cld 
# lap1 2.839435 3.494157 4.806954 3.854269 5.611413 103.0111 10000 a 
# repl 3.091829 3.777199 5.140789 4.165856 6.013591 101.4318 10000 b 
# lap2 3.131491 3.761274 5.089170 4.140316 5.939075 101.1983 10000 b 

autoplot(mb) 

enter image description here

+1

replicate' ist in der Regel die schnellste Option. –

+1

Das könnte der Fall sein. Aber in diesem Fall sind die 'Lapply's besser als die' Replicate', wie das oben gezeigte Benchmarking zeigt. – Suren

Verwandte Themen