2016-11-27 7 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)) 
    } 
} 

Теперь я хочу назначать разные результаты в зависимости (вектор длины 10) к ряду г-го матриц, которые должны каким-то образом, как это:

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'. Кроме того, я попытался с помощью get() -функции:

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) 
    } 
    } 
} 

, который привел ошибку 'target of assignment expands to non-language object'. Кто-нибудь знает правильное решение? Дайте мне знать, если вам нужна дополнительная информация.

+0

РУТ подряд, вы намерены изменить ту же строку в каждой матрице? – Parfait

+0

Да, это правильно! – Julia236

ответ

2

Рассмотрите возможность сохранения всех объектов в списке, используя lapply, особенно, поскольку они имеют одинаковую структуру. При таком подходе вы избегаете миллионов матриц, наводящих вашу глобальную окружающую среду, становясь головной болью управления! Кроме того, вы можете легко запускать те же операции, что и r-я строка для всех элементов матрицы. Кроме того, вы избегаете вложенных циклов for или используете assign и get и eval(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); m [[1, 1]] <- matrix (1:20, 4) ' – Frank

+0

Действительно, @Frank! OP может даже использовать массив: 'a <- array (NA, dim = c (4,5,4))'. – Parfait

+0

Думаю, им нужны 4 измерения, i, j, r и column ...? – Frank