Изменить значения динамически выбранного списка в R - PullRequest
0 голосов
/ 10 октября 2018

У меня есть несколько списков в базе R, я хочу перебрать эти списки и внести изменения в элементы списка.Я хочу сделать это изменение в одной строке, жесткое кодирование имени каждого списка не вариант:

a <- list(thing1=1:5,
          thing2=6:10)

b <- list(thing1=1:5,
          thing2=6:10)

for(list in c("a","b"){

   an_element <- paste(list,
                       "$thing1",
                      sep="") # i.e "a$thing1"

    assign(an_element,20:25) # change value of element thing1 in lists

}

get("a$thing1") # shows change

a$thing1 # does not show change

Как показывает документация для assign, объект a не был изменен.Я не могу передать a в последующие функции и ожидать, что значения thing1 будут такими, как я их изменил.Мне нужен способ сделать цель операции переназначения динамической, заданной переменной.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Нашел решение.

a <- list(thing1=1:5,
          thing2=6:10)

b <- list(thing1=1:5,
          thing2=6:10)

c <- list(thing1=1:5,
          thing2=6:10)

for(list in c("a","b","c")){

  assign("tempList",list)

  tempList$thing1 <- 6:10

  assign(list,tempList)

}

a$thing1 # shows change
b$thing1
c$thing1

Подчеркивая здесь, что цель состоит в том, чтобы оперировать большим количеством списков, без необходимости повторять строки, которые изменяют список, для каждого списка, над которым нужно работать.Вы динамически назначаете свой активный список (активный в цикле) временному списку имени исправления.Затем вы делаете операции в этом списке.Для справки, я пытаюсь переписать матрицу данных модели VAR из пакетов "vars".У меня есть определенная проблема прогнозирования, которая требует изменения данных большого количества моделей VAR и последующего составления прогнозов из них.

0 голосов
/ 10 октября 2018

на вашем примере:

a <- list(thing1=1:5,
          thing2=6:10)

Существует множество способов циклического перемещения по элементам списка:

anames <- names(a)
anames
# [1] "thing1" "thing2"
for(i in 1:length(anames)) {
  print(a[[anames[i]]])
}
# [1] 1 2 3 4 5
# [1]  6  7  8  9 10

, используя этот индекс, вы также можете установить значение

for(i in 1:length(anames)) {
  a[[anames[i]]] <- 5*(i+2)+1:5
  print(a[[anames[i]]])
}
# [1] 16 17 18 19 20
# [1] 21 22 23 24 25

или вы можете напрямую использовать индекс

for(i in 1:length(anames)) {
  a[[i]] <- 5*(i+2)+1:5
  print(a[[anames[i]]])
}
# same result

, и вы можете использовать

b <- lapply(a, function(x) {
  x+15
})
b$thing1
#[1] 16 17 18 19 20

Я не думаю, что есть чистый способ сделать это с помощью команды assign

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...