2016-11-27 3 views
0

私は、1,000,000行列XY_1_1を生成...、XY_1000_1000を:

for (i in 1:1000){ 
    for (j in 1:1000){ 
     assign(paste0("XY",i,j ,sep='_'), matrix(ncol=10, nrow=4)) 
    } 
} 

今私がしたいです

for (r in 1:4){ 
    for (i in 1000){ 
    for (j in 1:1000){ 
     assign(paste0("XY",i,j ,sep='_')[r,], function(i,j,r)) 
    } 
    } 
} 

残念ながら、私はエラー'incorrect number of dimensions'を得る:何とかこのようべき行列のr番目の行に機能の異なる結果(長さ10のベクトル)を割り当てます。エラー'target of assignment expands to non-language object'をもたらした

for (r in 1:4){ 
    for (i in 1000){ 
    for (j in 1:1000){ 
     get(paste0("XY",i,j ,sep='_'))[r,] <- function(i,j,r) 
    } 
    } 
} 

: はさらに、私はget() -functionを使用してみました。誰かが適切な解決策を知っていますか?さらなる情報が必要な場合に備えてお知らせください。

+0

すべての行列で同じ行を変更しようとしていますか? – Parfait

+0

はい、これは正しいです! – Julia236

答えて

2

lapplyを使用してすべてのオブジェクトをリストに保存することを検討してください。特に、それらは同じ構造であるためです。このアプローチでは、あなたの地球環境を氾濫させる何百万ものマトリックスが管理上の頭痛になるのを防ぎます!さらに、すべての行列要素にわたってr番目の行と同じ操作を簡単に実行できます。さらに、ネストしたforループを避けるか、assigngeteval(parse(paste...)))を使用します。 list2env

# LIST OF A MILLION MATRICES (SAME DIMS) 
matlist <- lapply(seq(1000000), function(i) matrix(ncol=10, nrow=4)) 

# NAMING LIST ITEMS 
itemnames <- paste0("XY", c(outer(seq(1000), seq(1000), paste0))) 
matlist <- setNames(matlist, itemnames) 

# UPDATING MATRIX 
matlist <- setNames(lapply(seq(length(matlist)), function(i){   
    mat <- matlist[[i]] 
    for (r in seq(4)) { 
     mat[r,] <- some_function(i,r) 
    } 
    return(mat) 
}), itemnames) 

# OUTPUT INDIVIDUAL ELEMENTS TO SEPARATE GLOBAL OBJECTS 
list2env(matlist, envir=.GlobalEnv) 
+3

あるいは、 'm = matrix(list()、2、2)のように、4次元配列や行列の行列を使うこともできます。 m [[1,1]] < - 行列(1:20、4) ' – Frank

+0

実際、@フランク! OPは配列を使用することもできます: 'a < - array(NA、dim = c(4,5,4))'。 – Parfait

+0

私は4次元、i、j、r、列が必要だと思います...? – Frank