2012-11-17 4 views
8

목록에서 중첩 수준을 결정하는 쉬운 방법 (즉, 함수)이 있습니까? 이 정보를 얻는 데 사용할 수있는 str을 알고 있습니다. 그러나 결과를 단순히 되돌려주는 것이 있습니까? 그리고 그러한 함수를 사용하여 모든 수준의 alist (재귀 적으로)의 이름을 얻을 수 있습니까? 모든 요소의 이름을 지정하는 경우R에서 중첩 수준을 결정 하시겠습니까?

+1

당신은'시도 할 수 범프됩니다 패키지 번 공식 크랑 버전의 일부가 될 것입니다 - (capture.output (str (mylist, nest.lev = 1)) [- 1])'문자열 처리를 사용하여's'의 각 원소를 시작하는'..'의 수를 잡아냅니다. (10 분 후에 더 좋은 대답이 나오지 않으면 나에게 직접 그 기회를 줄 것이다.) –

답변

10

약간의 재귀 함수가 당신을 위해이 작업을 수행 할 수 있습니다

depth <- function(this,thisdepth=0){ 
    if(!is.list(this)){ 
    return(thisdepth) 
    }else{ 
    return(max(unlist(lapply(this,depth,thisdepth=thisdepth+1))))  
    } 
} 

당신이 한 경우 로우를 사용하는

l1=list(1,2,3) 
l2=list(1,2,l1,4) 
l3=list(1,l1,l2,5) 

require(testthat) 
expect_equal(depth(l1),1) 
expect_equal(depth(l2),2) 
expect_equal(depth(l3),3) 

사과 : package:testthat있어, 여기에 테스트 세트입니다 변수 이름에 r-case L. 가독성이 떨어집니다.

+9

+1 - 조금 더 짧을수록 '깊이가 더 작을 것이다'- if (this) ifelse (is.list), 1L + max (sapply (이, 깊이)), 0L)' – flodel

+0

아주 좋은 솔루션! –

+0

멋진 개선! 내 검사를 통과했다. R 코드 골프 누구? – Spacedman

2

, 당신은 (unlist의 코드에서)이를 사용할 수 있습니다

mylist <- list(a=list(x=1),b=list(c=list(y=c(2,3)),d=c("a","b"))) 
names(.Internal(unlist(mylist, TRUE, TRUE))) 
#[1] "a.x" "b.c.y1" "b.c.y2" "b.d1" "b.d2" 
0

purrr 패키지의 depth()을 사용할 수 있습니다!

참고 : 현재 함수가 purrr의 개발 버전의 일부이지만 버전의 <

관련 문제