2017-11-14 12 views
2

중첩 목록이있어 특정 이름을 가진 모든 노드/요소를 제거해야합니다. 예를 들어, 다음에 정의 된 R list()에서 이름이 'lol'인 모든 노드를 제거하고 싶습니다. 계층 구조의 여러 수준에서 나타날 수 있습니다.특정 이름을 가진 목록 요소 제거하기

트리를 스캔하여 노드를 제거하는 가장 좋은 방법은 무엇입니까?

tree <- list(
    A = list(
     A_1 = list(
      A_1_1 = list(), A_1_2 = list() 
     ), 
     lol = "haha" 
    ), 
    B = list(
     B_1 = list(
      B_1_1 = list(), B_1_2 = list(), lol = "rofl" 
     ) 
    ) 
) 

나는 그 결과가되도록 트리 객체에 대한 몇 가지 작업을 수행하고 싶습니다 :

$A 
$A$A_1 
$A$A_1$A_1_1 
list() 

$A$A_1$A_1_2 
list() 



$B 
$B$B_1 
$B$B_1$B_1_1 
list() 

$B$B_1$B_1_2 
list() 
당신은 그 요소를 제거하는 간단한 재귀 함수 기능을 만들 수 있습니다
+1

을 고마워, 지금 고쳐야한다. – dcl

+0

게시물을 업데이트 한 것 같습니다. 깊이 중첩 된 다른 중첩 된 케이스와 같은 다른 패턴이 있습니까? – akrun

답변

2

:

foo <- function(x) { 
    x <- x[names(x) != "lol"] 
    if(is.list(x)) lapply(x, foo) 
} 

foo(tree) 
# $A 
# $A$A_1 
# $A$A_1$A_1_1 
# list() 
# 
# $A$A_1$A_1_2 
# list() 
# 
# 
# 
# $B 
# $B$B_1 
# $B$B_1$B_1_1 
# list() 
# 
# $B$B_1$B_1_2 
# list() 
+0

감사합니다. 재귀 함수는 결코 내 강점이 아닙니다. – dcl