R :

2011-12-19 4 views
2

을 병합하지 않고 cbind를 통해 목록의 목록, 우리는 예를 들어 목록의 요소로 쌍을 저장하고 싶은 가정R :

하나가 명시 적 참조하지 않고, 연결과 같은 일을 만들려고하면
> x <- list() 
> x[[1]] <- list(1,2) 
> x[[2]] <- list(3,4) 
> x 
[[1]] 
[[1]][[1]] 
[1] 1 

[[1]][[2]] 
[1] 2 


[[2]] 
[[2]][[1]] 
[1] 3 

[[2]][[2]] 
[1] 4 

외부에서의 인덱스는 자연 접근법은 c() 두 번째 인수의 "평탄화"를 방지하는 방법이 있는가

> c(list(list(1,2)),list(3,4)) 
[[1]] 
[[1]][[1]] 
[1] 1 

[[1]][[2]] 
[1] 2 


[[2]] 
[1] 3 

[[3]] 
[1] 4 

이다 (이 방법에 대한 동기 부여 이하 EDIT 참조)하여 x 생산 연결을 사용 ?

편집 : 의도 한 응용 프로그램을 분명하게해야합니다.

결국 루프를 통과 할 때마다 목록에 쌍을 추가하고 싶습니다. 현재 나는 주 목록에 대한 색인을 유지하여 그 끝에 새로운 쌍을 추가합니다. 그러나 c을 사용하는 것이 아마 더 자연 스럽습니다. 명시 적으로 인덱스를 사용 그래서 루프는이

index <- 1 
l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) { 
      l[[index]] <- list(i,j) 
      index <- index + 1 
     } 
    } 
} 

처럼 보일 수 있습니다 그리고 c를 사용하는 시도가 실패한이

l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) 
      l <- c(l,list(i,j)) 
    } 
} 

답변과 같습니다 아래 토미, 여분의 목록 (에 의해 언급 된 바와 같이) 필요 , 그래서 다음 작품 :

l <- list() 
for (i in 1:10) { 
    for (j in (i+1):10) { 
     if ((i+j)%%2 == 0) 
      l <- c(l,list(list(i,j))) 
    } 
} 

나는 분명히 알아야 할 종류. Tommy는 이것이 일을하는 좋은 방법이 아닐 수도 있다고 지적합니다.

+0

당신이 찾고있는 것이 확실하지 않지만'c (list (1, 2), list (3, 4))'입니까? – Ramnath

+1

일반적으로 실제 문제가 예제 코드와 닮은 경우 목록 끝에 추가하는 것이 올바른 접근법입니다 (R에서 어색한 경우 사용자가 발견 한 것처럼). 어색하게 느껴지는 간단한 작업을 만났을 때 언어가 사용되는 방식으로 문제를 해결하지 않는 것이 좋은 신호입니다. – joran

+1

당신이 즉각적인 문제를 알아 냈기 때문에 기쁘다. 그리고 내가 앞서 말한 것을 다시 말해 줄 것이다 : preallocation. 이 답변은 몇 가지 성능 비교를 보여줍니다 ... 복잡한 기능을 사용하여 최대 몇 분 또는 몇 시간까지 쉽게 풍선을 만들 수 있습니다. 행운을 빕니다! http://stackoverflow.com/questions/4034059/iteratively-constructed-dataframe-in-rx – Chase

답변

3

간단한 대답은 "아니요, 추가 목록() 래퍼가 필요합니다"입니다.

하지만, 일반적으로는 c()

x <- NULL 
for(i in 1:2) x <- c(x, list(list(i,i+1))) 
x 

x <- vector('list', 2) 
for(i in seq_along(x)) x[[i]] <- list(i,i+1) 
x 

를 사용하는 것보다 미리 할당리스트에 색인을 사용하여 값을 추가하고 lapply 사용할 수 있다면 더 (속도/적은 메모리)이며, 즉 대개 훨씬 더 효율적입니다 :

lapply(1:2, function(i) list(i, i+1)) 
+0

고마워, 토미! –