如何访问数组的元素?

时间:2016-08-04 13:54:47

标签: arrays r

我正在处理包含这些对象的数组。当我比较两个不同数组的元素时,它会在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是主程序调用的函数。内部for循环将执行一次但是对于第二次执行,即当x4 = 2时,它给出了错误cell_list [x4,3,1]中的错误:维数不正确。请有人帮帮我。 这里cnt1被传递给函数insert_nbrlist。 cnt1是nbr_list的table1中存在的行数,并且是常量。 cnt2表示cell_list的table1中存在的行数,并且它一直在增加。 cnt2我没有传递给函数,因为它在该函数中增加了。调用该函数不会产生任何错误,但错误是在函数insert_nbrlist中生成的。

我想以另一种方式提出这个问题。我有一个初始化为cell_list&lt; - 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之后也无法访问元素。

1 个答案:

答案 0 :(得分:1)

我的猜测是你的问题是else区块中的这一行:

cnt2 <- cnt2+1

这会将cnt2的值推高到25以上,因为它是25x6x1数组,所以它将超出范围。

修改

我怀疑rbind在3-D阵列上无法正常工作。您可以使用abind代码而不是rbind

更多on this answer