2013-02-01 71 views
7

tôi có một danh sách như:Tìm các chỉ mục của một phần tử trong danh sách lồng nhau?

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

là có một cách (loop-free) để xác định vị trí của các yếu tố, ví dụ nếu tôi muốn thay thế một giá trị của "C" với 5, và nó không quan trọng mà các yếu tố "C" được tìm thấy, tôi có thể làm một cái gì đó như:

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

Tôi đã thử grepl, và trong hiện tại ví dụ: nội dung sau sẽ hoạt động:

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

nhưng điều này đòi hỏi giả định mức làm tổ.

Lý do mà tôi hỏi là tôi có một danh sách sâu sắc về giá trị tham số, và một vector được đặt tên của các giá trị thay thế, và tôi muốn làm một cái gì đó giống như

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

này là một sự thích nghi cho câu hỏi trước đây của tôi , update a node (of unknown depth) using xpath in R?, sử dụng danh sách R thay vì XML

Trả lời

7

Một phương pháp là sử dụng 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) 

Bởi vì tên danh từ không công khai được nối với một ., bạn sẽ cần phải cẩn thận với grep và cách các tham số của bạn được đặt tên. Nếu không có . trong bất kỳ tên danh sách nào của bạn, điều này sẽ ổn. Nếu không, các tên như list(.C = 1) sẽ rơi vào mẫu và được thay thế.

1

Dựa trên this question, bạn có thể thử nó một cách đệ quy như thế này:

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

kiểm tra trong một mylist sâu hơn:

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 
Các vấn đề liên quan