2013-02-01 15 views
7

Iのようなリストを持っている:例えば、ネストされたリストの要素のインデックスを探しますか?

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

、要素の位置を識別するために(ループのない)方法があります私は5で、「C」の値を交換したい、要素「C」が発見された場所は関係ありませんならば、私のような何かを行うことができます。

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

私はgreplを試してみましたが、現在でたとえば、次のように動作します。

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

ただし、これには入れ子レベルの前提が必要です。

私は私の前の質問への適応が、私は、パラメータ値の深いリスト、および置換値の名前のベクトルを持っている、と私は

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

このような何かをしたいということです尋ねる理由update a node (of unknown depth) using xpath in R?、XMLの代わりにRリストを使用

答えて

7

unlistおよびrelistを使用する方法が1つあります。

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) 

非公開にからのリスト名は.と連結されているので、あなたはgrep方法やパラメータの名前付けに注意する必要があります。あなたのリスト名のいずれかに.がない場合、これはうまくいくはずです。そうでなければ、list(.C = 1)のような名前はパターンに入り、置き換えられます。

1

this questionに基づいて、あなたはこのように再帰的にそれを試みることができる:

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 
    } 
} 

テストを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 
関連する問題