2017-07-29 5 views
0

Ich habe eine Funktion, die eine for-Schleife enthält, die 160 Mal iteriert und nach jeder Iteration ein 3-dimensionales Array erzeugt. Ich möchte, dass die For-Schleife jedes Array separat als Objekt unter dem Namen speichert, beispielsweise array001, array002, array003 usw., vorzugsweise ohne diese in den globalen Arbeitsbereich auszuspucken. Schließlich möchte ich einige dieser Arrays später innerhalb derselben Funktion aufrufen können.Erstellen eines separaten Objekts für jede Iteration von for-Schleife innerhalb einer Funktion

array.function <- function(df, parameter = 0) { 
         for (i in 1:160) { 
          DO A LOT OF STUFF 
          SAVE OUTPUT AS array### 
         } 

         DO MORE STUFF with arrays generated by for-loop above 
        } 

Haben Sie Ideen, wie Sie die Arrays als Objekte mit entsprechenden Zahlen in ihren Namen speichern können? Vielen Dank!

+0

Setzen Sie jedes Array in ein separates Element einer Liste. Dann gib die Liste zurück. Etwas wie 'myList [[i]] <- array.function (df, i)' oder was auch immer. Du könntest Namen hinzufügen mit 'einfügen'' myList [[paste0 ("array", i)]] <- ... '. – lmo

+1

Danke. In diesem Fall müsste ich die Arrays jedoch an die interne Liste der Funktion anhängen und dann die Listenelemente weiter unten in der Funktion indizieren, nachdem die letzte Schleife die Liste gefüllt hat. Ich nehme an, das ist es, was du meintest. –

Antwort

0

Der Kommentar von lmo ist eine gute praktikable Lösung zum Speichern der Arrays und Zugriff später in der Funktion. Wenn Sie jedoch wirklich als separate Variablen gespeichert werden sollen, sie werden, anstatt als eine Liste, assign() und get() sind deine Freunde:

array.function <- function(df, parameter = 0) { 
    # This stores the function's environment for convenience: 
    env <- environment() 
    for (i in 1:160) { # Then for each iteration 
    # make an array and store it in the function's environment 
    assign(paste0('array', i), array(c(i, 2:27), dim=c(3, 3, 3))) 
    } 
    # Then print out a randomly selected array to make sure it worked 
    print(get(paste0('array', sample(1:160, 1)))) 
    # I don't know what you want to do with the arrays, 
    # for now just return the whole function's environment 
    # (the arrays as well as 'i', 'df', 'env', and 'parameter') 
    return(as.list(sapply(ls(envir=env), get, envir=env))) 
} 

x <- array.function(1) # the 1 is just because I kept your arguments 

, , 1 

    [,1] [,2] [,3] 
[1,] 158 4 7 
[2,] 2 5 8 
[3,] 3 6 9 

, , 2 

    [,1] [,2] [,3] 
[1,] 10 13 16 
[2,] 11 14 17 
[3,] 12 15 18 

, , 3 

    [,1] [,2] [,3] 
[1,] 19 22 25 
[2,] 20 23 26 
[3,] 21 24 27 

Für jede Iteration der Schleife, assign(paste0('array', i), value) erzeugt eine Variable in der Umgebung der Funktion - nicht die globale Umgebung, zumindest nicht standardmäßig - deren Name ist das Ergebnis von paste0('array', i) und deren Wert ist value (welches Array Sie auch erstellen). Sie können später mit get(paste0('array', x)) darauf zugreifen, wobei x die Nummer des Arrays ist, das Sie benötigen.

Eine hervorragende Quelle, um mehr über Funktionsumgebungen zu erfahren, ist Hadley Wickham's book.

+0

Danke, es hat funktioniert! Ich habe nicht das Setup der Umgebung benutzt, da es sich als überflüssig erwiesen hat, genau wie du es erwähnt hast. –

Verwandte Themen