Как пролистывать oop и редактировать определенные элементы вложенного списка? - PullRequest
2 голосов
/ 08 мая 2020

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

# example:
a <- list()
a$var1$var11 <- 101
a$var1$var12 <- 102
a$var2$var21 <- 201
a$var3$var31 <- 301
str(a)



# output
#List of 3
# $ var1:List of 2
#  ..$ var11: num 101
#  ..$ var12: num 102
# $ var2:List of 1
#  ..$ var21: num 201
# $ var3:List of 1
#  ..$ var31: num 301

Но допустим, что список намного больше, и каждый раз его размер меняется. . Как я могу l oop через каждые var1, var2 проверять, соответствует ли имя точно var2, а затем изменять значение в a$var2$var21 с 201 на другое?

Я пробовал это:

for (elem in str(a)){
  print(elem)
  if(elem==var2){
    print(elem)
  }
}

Этот кажется, работает нормально, но результат:

List of 3
 $ var1:List of 2
  ..$ var11: num 101
  ..$ var12: num 102
 $ var2:List of 1
  ..$ var21: num 201
 $ var3:List of 1
  ..$ var31: num 301

И что Я действительно хотел бы использовать elem для подмножества частей списка, чтобы elem заменил var1 в a$var1$var11, например, a$elem$var11, и результат был бы num 101

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

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Мы могли бы сделать

for(nm in names(a)) if(nm == 'var2') a[[nm]][[1]] <- 'new'
1 голос
/ 08 мая 2020

Я не совсем уверен, что вы хотите делать с заменой logi c. Но подумал, что предлагаю по крайней мере альтернативный синтаксис, с которым вам будет легче работать, начиная с purrr

library(purrr)
# example:
a <- list()
a$var1$var11 <- 101
a$var1$var12 <- 102
a$var2$var21 <- 201
a$var3$var31 <- 301

a
#> $var1
#> $var1$var11
#> [1] 101
#> 
#> $var1$var12
#> [1] 102
#> 
#> 
#> $var2
#> $var2$var21
#> [1] 201
#> 
#> 
#> $var3
#> $var3$var31
#> [1] 301


# with pluck you can use either strings or numeric index
pluck(a, "var1", "var11")
#> [1] 101

# I think you want to iterate over every single list item?

for(elem in seq_along(a)) {
  for(subelement in seq_along(pluck(a, elem))) {
    print(pluck(a, elem, subelement))
    mytarget <- pluck(a, elem, subelement)
    if(mytarget == 201) {
      pluck(a, elem, subelement) <- 999
      cat("Replacment made\n")
    }
  }
}
#> [1] 101
#> [1] 102
#> [1] 201
#> Replacment made
#> [1] 301
a
#> $var1
#> $var1$var11
#> [1] 101
#> 
#> $var1$var12
#> [1] 102
#> 
#> 
#> $var2
#> $var2$var21
#> [1] 999
#> 
#> 
#> $var3
#> $var3$var31
#> [1] 301

Создано 08.05.2020 с помощью пакета репекс (v0.3.0)

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