2013-02-22 11 views
5

Attualmente ho un ciclo - beh, in realtà un loop in loop, in un modello di simulazione che rallenta con un numero maggiore di individui. Ne ho vettorializzato la maggior parte e ne ho reso molto più veloce. Ma c'è una parte in cui ho assegnare più elementi di una lista come la stessa cosa, semplificando un grande anello al solo compito che voglio raggiungere:R assegnare più elementi di lista allo stesso oggetto

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

Con ogni iterazione del ciclo della linea di cui sopra si chiama, e lo stesso oggetto matrice viene assegnato al prossimo nuovo elemento di una lista.

Sto provando a vettorizzare questo - se possibile, o renderlo più veloce di un ciclo o applicare una dichiarazione.

Finora ho provato cose lungo le linee di:

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

Tuttavia questo si traduce nel messaggio:

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

Si cerca anche di assegnare un valore del old.matrix ad un elemento di new.matrices in questo modo:

[[1]] 
[1] 8687 

[[2]] 
[1] 1 

[[3]] 
[1] 5486 

[[4]] 
[1] 0 

Quando il risultato desiderato è una lista eleme nt = una matrice intera, una copia di old.matrix

C'è un modo per vettorizzare una matrice negli elementi di lista senza eseguire il ciclo? Con loops come è attualmente implementato stiamo parlando di molte migliaia di ripetizioni che rallentano notevolmente le cose, da qui il mio desiderio di vettorializzare questo se possibile.

+6

'new.matrices [indici] <- rep (lista (old.matrix), lunghezza (indici))' – hadley

+1

Scommetto che c'è un modo migliore per costruire un oggetto di archiviazione per qualsiasi cosa tu abbia intenzione di produrre. Sostituirai ogni 'new.matrices [[k]]' con qualche matrice calcolata più tardi? (Non sembra molto opportuno archiviare N copie degli stessi dati) In tal caso, non è necessario creare preventivamente ogni voce di elenco. Prossima domanda: hai davvero bisogno di una lista, o sarebbe un array di 3 ° rango 'allmatrices [i, j, k]', ogni livello di cui è 'oldmatrix' è sufficiente? –

+0

Le matrici sono 2 in row e n in col e memorizzano le informazioni relative ai geni posseduti da un individuo. Quello che sta succedendo qui è la riproduzione asessuata tramite spore. il numero di colonne dipende dal numero di geni - i geni possono essere duplicati o cancellati. Ognuno di 'new.matrices' cambierà dopo questo a causa di vari processi mutazionali. Quindi per old.matrix [[1]] - diciamo che produce 20 figli, viene inserito nella new.matrix 20 volte, prima di essere soggetto a funzioni che eseguono processi mutazionali.Questo elenco viene anche copiato in un elenco di risultati ogni ciclo di simulazione a scopo di risultati. – Ward9250

risposta

1

Probabilmente hai già risolto il problema, in ogni caso, il problema nel codice

new.matrices[indices] <- old.matrix 

è stato causato da cercando di sostituire alcuni oggetti (le NULL elementi nel proprio elenco new.matrices) con qualcosa di diverso, un matrix. Quindi, R importa old.matrix in un vettore e prova ad attaccare ogni singolo valore a un altro elemento di elenco, (questo è il motivo per cui hai ottenuto questo risultato e quando, per esempio, reps è 4 o 8 e old.matrix NON è una matrice 2 x 2, anche tu prendi il warning). Facendo

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

funzionerà e R replicherà l'elenco singolo elemento list(old.matrix) "reps" tempi automaticamente.

Problemi correlati