2017-07-29 35 views
0

我有一個函數,它包含一個迭代160次的for循環,在每次迭代後產生一個3維數組。我希望for循環將每個數組分別保存爲名稱下的對象,如array001array002,array003等,最好不要將這些數組吐出到全局工作空間。最後,我希望能夠在同一個函數中稍後調用其中的一些數組。爲函數內for循環的每次迭代創建一個單獨的對象

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 
        } 

任何關於如何將數組保存爲其名稱中具有相應數字的對象的想法?謝謝!

+0

將每個數組放入列表的單獨元素中。然後返回列表。就像'myList [[i]] < - array.function(df,i)'或其他。你可以用'paste''myList [[paste0(「array」,i)]] < - ...'添加名稱。 – lmo

+1

謝謝。雖然在這種情況下,我將不得不將數組附加到函數內部的列表,然後在for循環完成填充列表之後,將列表元素索引到函數的更下方。我認爲這是你的意思。 –

回答

0

來自lmo的評論是一個非常實用的解決方案,用於存儲數組並在稍後的函數中訪問它們。但是,如果你真的希望他們能夠被存儲爲獨立的變量,而不是作爲一個列表,assign()get()是你的朋友:

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 

爲了您的每次循環,assign(paste0('array', i), value)會在函數的環境變量 - 不是全球環境,至少不是默認的 - 其名稱是paste0('array', i)的結果,其值是value(無論您創建的是哪個數組)。您可以稍後使用get(paste0('array', x))訪問它,其中x是您需要的陣列號。

瞭解更多關於功能環境的優秀資源是Hadley Wickham's book

+0

謝謝,它工作!我沒有最終使用環境設置,因爲它被證明是多餘的,就像你剛纔提到的那樣。 –

相關問題