динамически изменяющееся имя списка в цикле с использованием assign? - PullRequest
1 голос
/ 16 июня 2011

Лучше всего привести пример: этот код должен, по моему мнению, создать 10 списков по 100 элементов в каждом.

for (i in 1:10){
assign(paste("List", i, sep="."), vector("list", length=100))
  for (j in 1:100){
    assign(paste("List", i, sep=".")[[j]], j+1)
  }
}

Но это не так. Первое назначение работает нормально, создает пустой список из 100 элементов, но как мне заполнить элемент [[j]] в нем?Спасибо!

Ответы [ 3 ]

6 голосов
/ 16 июня 2011

Вместо создания 10 списков в глобальной среде было бы намного проще составить список списков:

mybiglist <- list()
for(i in 1:10) {
  mybiglist[[i]] <- list()
  for( j in 1:100 ) {
    mybiglist[[i]][[j]] <- j+1
  }
}

Вы можете добавить имена в любой из списков или просто получить доступ к частям по числовым индексам. это также не портит вашу глобальную среду и, как правило, легче отлаживается. И когда вы хотите что-то сделать с 10 списками, вы можете просто использовать lapply / sapply вместо того, чтобы бороться с другим циклом. Вы также можете сохранить / загрузить / удалить / исследовать / и т. Д. один объект вместо 10.

5 голосов
/ 16 июня 2011

Проблема в том, что вы не можете использовать assign для присваивания значений элементам объектов, если вы не стали немного хитрее.Смотри ниже.

for (i in 1:10){
  assign(paste("List", i, sep="."), vector("list", length=100))
  for (j in 1:100){
    assign(paste("List", i, sep="."), 
      {x <- get(paste("List", i, sep=".")) 
       x[[j]] <- j + 1 
       x})
  }
}

rm(i, j, x)
1 голос
/ 16 июня 2011

Приведенный ниже код создает 10 списков по 100 элементов в каждом.

myList = list()

for (i in 1:10) {
      myList[[i]] = 1:100
}

Однако не уверен, хотите ли вы 10 списков векторов ИЛИ 10 списков списков

Если вы хотите последнее, вы можете сделать что-то вроде:

myList = list()

for (i in 1:10) {
  myList[[i]] = list()

  for (j in 1:100) {
      myList[[i]][[j]] = j
  }  
}
...