2013-02-01 14 views
7

mam listę:Znajdź indeksy elementu na liście zagnieżdżonej?

mylist <- list(a = 1, b = list(A = 1, B = 2), c = list(C = 1, D = 3)) 

jest tam pętli (wolne), aż do zidentyfikowania położenia tych elementów, na przykład jeśli chcę, aby zastąpić wartości „C” z 5, i nie ma znaczenia, gdzie element „C” zostanie znaleziony, można zrobić coś takiego:

Aindex <- find_index("A", mylist) 
mylist[Aindex] <- 5 

Próbowałem grepl, aw prądu na przykład: zadziała:

mylist[grepl("C", mylist)][[1]][["C"]] 

, ale wymaga to założenia poziomu zagnieżdżenia.

Dlatego, że pytam jest to, że mam głębokie listę wartości parametru, a nazwanego wektor wartości zamiennych i chcę zrobić coś podobnego

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

Jest to adaptacja do mojego poprzedniego pytania , update a node (of unknown depth) using xpath in R?, używając list R zamiast XML

Odpowiedz

7

Jedna metoda polega na użyciu unlist i relist.

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) 

Ponieważ nazwy listy z wyświetlać na liście są łączone z ., trzeba być ostrożnym z grep iw jaki sposób parametry są nazwane. Jeśli nie ma nazwy . w żadnej z nazw na liście, powinno być dobrze. W przeciwnym razie nazwy takie jak list(.C = 1) wpadną do schematu i zostaną zastąpione.

1

podstawie this question, można spróbować rekurencyjnie tak:

find_and_replace <- function(x, find, replace){ 
    if(is.list(x)){ 
    n <- names(x) == find 
    x[n] <- replace 
    lapply(x, find_and_replace, find=find, replace=replace) 
    }else{ 
    x 
    } 
} 

Testowanie w głębsze mylist:

mylist <- list(a = 1, b = list(A = 1, B = 2), c = list(C = 1, D = 3, d = list(C=10, D=55))) 
find_and_replace(mylist, "C", 5) 
$a 
[1] 1 

$b 
$b$A 
[1] 1 

$b$B 
[1] 2 


$c 
$c$C ### it worked 
[1] 5 

$c$D 
[1] 3 

$c$d 
$c$d$C### it worked 
[1] 5 

$c$d$D 
[1] 55 
Powiązane problemy