2016-03-22 8 views
0

私はPythonとC++の経験があり、それらの言語で私にとって意味のあることをしようとしていますが、明らかにRで作業していません。データを取得するために必要なネストされたオブジェクトを持つJSON配列がありますが、データをプロットできるように新しいデータフレームを作成するためにそれらを別々の配列に同期させる必要があります。ネストされたforループと外部カウンタでRに問題があります

私のデータは次のようになります。{URL:[data], ... {VisitHistory:{0:[number], 1:[number]}}}

私はVisitHistory配列内の各エントリに対して1行を取得し、表形式、にこれを入れしようとしているが、それらの行のそれぞれは、同じURLを持っています。

url<-c() 
views<-c() 
date<-c() 
iter<-1 

#bring in data 
output<-fromJSON(file='filename') 

#generate lists for each variable of interest 
for(n in 1:length(output)) { 
    for(x in 1:length(output[[n]]$th)) { 
    url[iter]<-c(output[[n]]$url) 
    if(!is.null(output[[n]]$th[[x]]$sh[[1]])) { 

     views[iter]<-c(output[[n]]$th[[x]]$sh[[1]]) 
    } 
    else { 
     views[iter]<-c(-1) 
    } 
    date[iter]<-c(output[[n]]$th[[x]]$ts[[1]]) 

    iter<-iter+1 
    } 
    iter<-iter+1 
} 

は私が自分自身のデータにマージされるまでurlviews、およびdateすべてがそれぞれのベクトルに同期を維持ことを確認するiterを使用しようとしている:ここで

は、私がこれまで持っているものですフレーム。しかし、 iterという変数をインデックスとしてそのブロックに代入をしようとすると、ループが無限に進み、その理由がわかりません。

私はあなたの助けに感謝します!

+0

[XY](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のようです。 – MichaelChirico

答えて

0

ループの中に変数iterを印刷して、実際に何かの反復処理や停止を確認しましたか?多分あなたのファイルはちょうど巨大です。私はソリューションを提供していません、あなたがこれをデバッグするのを助けるただの方法です。

また、変数のforループ内に動的にメモリを割り当てているため、処理が遅くなります。変数の先頭にある変数に固定サイズmatrixまたはsequenceseqまたはrep)を割り当てて、iter変数のサイズが使い果たされたときにループを中断させてください。それがうまくいくなら、時間が問題であることを知っています。例えば。

# Avoid dynamic allocation, which is slow 
# by preallocating memory. 
url<-rep(0, 10) 
views<-rep(0, 10) 
date<-rep(0, 10) 
iter<-1 

#bring in data 
output<-fromJSON(file='filename') 

#generate lists for each variable of interest 
for(n in 1:length(output)) { 
    for(x in 1:length(output[[n]]$th)) { 
    print(iter) # print the progression 
    url[iter]<-c(output[[n]]$url) 
    if(!is.null(output[[n]]$th[[x]]$sh[[1]])) { 

     views[iter]<-c(output[[n]]$th[[x]]$sh[[1]]) 
    } 
    else { 
     views[iter]<-c(-1) 
    } 
    date[iter]<-c(output[[n]]$th[[x]]$ts[[1]]) 

    iter<-iter+1 
    if(iter > 10) break 
    } 
    iter<-iter+1 
    if(iter > 10) break 
} 

plyrパッケージを使用して、必要な機能を定義し、それをリストに適用することを検討することもできます。しかし、最初に私が上に追加したものを試して、それがうまくいくかどうかを見てくださいまた、事前割り当てのための反復の最大数を見つけるために、あなたのような何かを行うことができます。また

maxiter <- 0 
for(i in 1:length(output)){ 
    maxiter <- maxiter + length(output[[i]]$th) 
} 

、なぜあなたは外部のループ内でITERの変数をインクリメントしていますか?最も内側のループでのみインクリメントする必要があります。

関連する問題