在嵌套列表中查找元素的索引?

Abe*_*Abe 7 recursion nested r list

我有一个列表,如:

mylist <- list(a = 1, b = list(A = 1, B = 2), c = list(C = 1, D = 3))
Run Code Online (Sandbox Code Playgroud)

是否有一种(无循环)方式来识别元素的位置,例如,如果我想用5替换"C"的值,并且找到元素"C"的位置并不重要,我可以做某事吗?喜欢:

Aindex <- find_index("A", mylist)
mylist[Aindex] <- 5
Run Code Online (Sandbox Code Playgroud)

我试过了grepl,在当前的例子中,以下内容将起作用:

mylist[grepl("C", mylist)][[1]][["C"]]
Run Code Online (Sandbox Code Playgroud)

但这需要假设嵌套级别.

我问的原因是我有一个深度的参数值列表,以及一个替换值的命名向量,我想做类似的事情

 replacements <- c(a = 1, C = 5)
 for(i in names(replacements)){ 
    indx <- find_index(i, mylist)
    mylist[indx] <-  replacements[i]
  }
Run Code Online (Sandbox Code Playgroud)

这是对我之前的问题的改编,使用R中的xpath更新节点(深度未知)?,使用R列表而不是XML

Blu*_*ter 8

一种方法是使用unlistrelist.

mylist <- list(a = 1, b = list(A = 1, B = 2), c = list(C = 1, D = 3))
tmp <- as.relistable(mylist)
tmp <- unlist(tmp)
tmp[grep("(^|.)C$",names(tmp))] <- 5
tmp <- relist(tmp)
Run Code Online (Sandbox Code Playgroud)

因为来自unlist的列表名称与a连接在一起.,所以您需要注意grep以及如何命名参数.如果.您的任何列表名称中没有a ,那么这应该没问题.否则,类似的名称list(.C = 1)将落入模式并被替换.