2016-08-04 3 views
-1

私はオブジェクトを含む配列を処理しています。 2つの異なる配列の要素を比較すると、cell_list [x4、3、1]にエラーとしてエラーが発生しています:次元数が正しくありません。コードの一部は次のとおりです。配列の要素にアクセスするには?

cnt2 <- 25 
cell_list <- array(0, c(cnt2,6,1)) 
nbr_list <- array(0, c(25,6,1)) 
insert_nbrlist = function(nbr_list, cell_list, cnt1) 
    { 
    for(x3 in 1:cnt1) 
     for(x4 in 1:cnt2) 
     { 
     if((nbr_list[x3,3,1] == cell_list[x4,3,1]) && (nbr_list[x3,4,1]== cell_list[x4,4,1])) 
     { 
      theta_diff <- cell_list[x4,1,1] - nbr_list[x3,1,1] 
      phi_diff <- cell_list[x4,2,1] - nbr_list[x3,2,1] 
     } 
     else 
     { 
      cnt2 <- cnt2+1 
      cell_list <- rbind(cell_list[,,1],nbr_list[x3,,1]) 
     } 
    } 
    return(cell_list) 
    } 

ここで、insert_nbrlistはメインプログラムによって呼び出される関数です。 Inner forループは1回実行されますが、2回目の実行時、つまりx4 = 2の場合、cell_list [x4,3,1]のエラー:[次元数が正しくありません]というエラーが表示されます。誰でも私を助けてくれますか? ここで、cnt1は関数insert_nbrlistに渡されます。 cnt1は、nbr_listのtable1に存在する行数で、定数です。 cnt2はcell_listのtable1に存在する行の数を表し、増加を続けます。私は関数に渡されていません、その関数で増加しているので。関数を呼び出すとエラーは発生しませんが、エラーは関数insert_nbrlist内で生成されます。

私は別の方法でこの質問をしたいと思います。私はcell_list < - array(0、c(25,6,1))に初期化されている配列を持っています。プログラムでは、cell_listのこのtable1にもう一つの行を追加しています。その配列から行を追加した後に配列から要素にアクセスする方法

この問題を解決するには、次のようなエラーが発生しています:cell_list [x4、3、1]のエラー。私は、簡単なコードを追加したいメインプログラム

func <- function() 
{ 

    cnt2 <- 25 

    insert_nbrlist = function(nbr_list, cell_list) 
    { 
    for(x3 in 1:25) 
     for(x4 in 1:cnt2) 
     { 
     if((nbr_list[x3,3,1] == cell_list[x4,3,1]) && (nbr_list[x3,4,1]== cell_list[x4,4,1])) 
     { 
      theta_diff <- cell_list[x4,1,1] - nbr_list[x3,1,1] 
      phi_diff <- cell_list[x4,2,1] - nbr_list[x3,2,1] 
     } 
     else 
     { 
      cnt2 <- cnt2+1 
      cell_list <- rbind(cell_list[,,1],nbr_list[x3,,1]) 
     } 
    } 
    return(cell_list) 
    } 

    cnt <- 0 
    m <- 50 
    r1 <- 10 
    dtheta <- 0.5 
    dphi <- 0.5 

    cell_list <- array(0, c(cnt2,6,1)) 
    nbr_list <- array(0, c(25,6,1)) 

    repeat 
    { 
    cnt <- cnt+1 
    s <- runif(2,-pi/2 : pi/2) 

    theta <- s[1] 
    phi <- s[2] 
    cnt1 <- 0 
    for(x1 in -2:2) 
     for(x2 in -2:2) 
     { 
     cnt1 <- cnt1+1 
     theta1 <- theta+x1*dtheta 
     phi1 <- phi +x2*dphi 

     x <- round(r1*(sin(theta1) + sin(theta1+phi1))+m/2, digits=0) 
     y <- round(r1*(cos(theta1)+ cos(theta1+phi1))+m/2,digits=0) 

     if((theta1 == theta) && (phi1 == phi)) 
      nbr_list[cnt1,,1] <- c(theta1, phi1, x, y, 1,1) 
     else 
      nbr_list[cnt1,,1] <- c(theta1, phi1, x, y, 1,0) 
     } 

     if(cnt==1) 
     cell_list <- nbr_list 

     else 
     cell_list <- insert_nbrlist(nbr_list, cell_list) 

     if(cnt == 50) 
     break 

    } 

}  

func() 

でコードを書き換えています。

test<- function() 
{ 
    sink("G:/rvma/test/test",append=FALSE) 
    nbr_list <- array(0, c(5,5,1)) 
    nbr_list[1,,1] <- 15 
    nbr_list[2,,1] <- -15 
    print(nbr_list) 
    n <- c(1,2,3,4,5) 
    nbr_list <- rbind(nbr_list[,,1],n) 
    print(dim(nbr_list)) 
    print(nbr_list) 
    print(nbr_list[,,1]) 
    sink() 
}  

rbindの前に配列の要素にアクセスすることができます。 rbindの配列が5X5X1から6X5X1に変更された後、print(nbr_list)を指定すると配列を出力できますが、print(nbr_list [,, 1])を指定すると同じ配列を出力できません。ここでは、nbr_list [、、1]のエラーErrorを取得しています:次元数が正しくありません。 rbindの後も要素にアクセスできません。

+0

「cnt1」とは何ですか?そしてなぜそれが 'insert_nbrlist'に渡されないのですか? 'insert_nbrlist(nbr_list、cell_list、cnt1、ctn2)'というエラーを生成する関数の呼び出しですか? – Qaswed

+1

お読みください:[すばらしいR再現可能な例を作成するには?](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) –

+0

@aichao 1.右今私は25行6列の1次元配列を使用しています。この1番目のテーブルの後の行数が増えます。 2.後で私は多次元配列 – Aparanji

答えて

1

私の推測では、あなたの問題ではelseブロック内にこの行です:

cnt2 <- cnt2+1 

これは25を超えてcnt2の価値を押し上げるだろう、それは25x6x1配列なので、それはアウトオブなります境界。

編集

私はrbindは、3-Dアレイ上で右動作していない疑いがあります。 rbindの代わりに使用できるパッケージabindがあります。

さらにon this answer

+0

あ、多分そうではありません。ちょうどrbindを見た。rbindが間違った次元に拘束されている場合を除きますか? –

+0

rbindの後だけですが、この問題に直面しています。 rbindの後、26行目が作成され、値が26行目にコピーされます。私はrbindの後にcell_listを印刷できますが、配列cell_listから要素にアクセスすることはできません。私はこの3日間からこれを踏まえています。私は続けることができません。私を助けてください – Aparanji

関連する問題