2016-08-04 68 views
-1

我正在處理包含對象的數組。當我比較兩個不同數組的元素時,它在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循環將被執行一次,但是對於第二次執行,即當x4 = 2時,它給出了錯誤cell_list [x4,3,1]中的錯誤:不正確的維數。請有人能幫助我嗎? 這裏cnt1被傳遞給函數insert_nbrlist。 cnt1是nbr_list的table1中存在的行數並且是恆定的。 cnt2表示cell_list的table1中存在的行數,並且它不斷增加。 cnt2我沒有傳遞給函數,因爲它在該函數中正在增加。調用該函數不會產生任何錯誤,但是該錯誤是在函數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]中的錯誤錯誤:不正確的維數。即使我無法在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列的一維數組。第一張桌子後面的行數會增加。 2.稍後,即使我想使用多維數組 – Aparanji

回答

1

我的猜測是你的問題是這條線在else塊:

cnt2 <- cnt2+1 

這會推高cnt2值超過25,而且因爲它是一個25x6x1陣列,這將是失界限。

編輯

我懷疑rbind是不是一個3-d陣列上正確工作。有一個包,abind你可以使用,而不是rbind

更多on this answer

+0

啊,也許不是。剛剛看過rbind。除非rbind綁定了錯誤的維度? –

+0

是的,只有我遇到了這個問題。在rbind之後,創建第26行並將值複製到第26行。我可以在rbind之後打印cell_list,但無法訪問數組cell_list中的元素。過去三天我一直在苦苦掙扎,我無法繼續。請有人幫助我 – Aparanji