如何使用for嵌套循环填充三维数组

如何使用for嵌套循环填充三维数组,r,arrays,for-loop,R,Arrays,For Loop,我想使用嵌套循环创建一个三维数组,问题是循环似乎不起作用。 代码是: s = array(NA,dim=c(5,5,4),dimnames=list(0:4,0:4,1:4)) for (i in 1:4) { for (j in 0:i ) { for (k in 0:i) { s[j,k,i]=(j+i+k) } } } 我希望矩阵中的每个元素(例如元素(j,k,I)都可以是(j+k+I),但是,最终结果中有许多NAs,我如何更改代码使其工作

我想使用嵌套循环创建一个三维数组,问题是循环似乎不起作用。 代码是:

s = array(NA,dim=c(5,5,4),dimnames=list(0:4,0:4,1:4))
for (i in 1:4)
{
  for (j in 0:i )
  {
    for (k in 0:i)
    {
      s[j,k,i]=(j+i+k)
    }
  }
}

我希望矩阵中的每个元素(例如元素(j,k,I)都可以是(j+k+I),但是,最终结果中有许多NAs,我如何更改代码使其工作?

与其他一些语言不同,在R中,原始基结构中没有零元素。因此,尝试分配第0个元素不会分配(有趣的是,这不会引起警告或错误)。因此,对于@r2evans注释,您需要通过指定的
dimnames
引用,这些名称总是强制为字符值

此外,要填充所有NAs,对于所有可能的组合,for的内部
循环需要扩展到值的全长,而不是终止于
i

### BY DIMNAMES
s1 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))

for (i in 1:4)
{
  for (j in 0:4)     # DO NOT END AT i
  {
    for (k in 0:4)   # DO NOT END AT i
    {
      s1[as.character(j),as.character(k),as.character(i)] <- (j+i+k)
    }
  }
}

可选地,考虑一个应用程序解决方案,使用代码< > MyPo< <代码>,首先生成所有可能的与扩展.GRID()/<代码>的组合,然后元素化地迭代向量,而不是按索引赋值并担心<代码> DimNeX/COD>,所有元素都分配给<代码> []/COD>:

s3 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))

prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s3[] <- mapply(function(i,j,k) (j+i+k), prms$j, prms$k, prms$i)

identical(s1, s3)
#[1] TRUE

(1) 当您使用
[j,k,i]
进行索引时,您是在数字列上进行索引,而不是在指定的名称上进行索引。如果要使用这些名称,它们必须是字符,例如
s[as.character(j)、as.character(k)、as.character(i)]
(这将解决缺少
“0”
平面的问题。(2)其余的
NA
s是因为你的循环。你期望零吗?(换言之,
s[1,1,1]
在每个轴的第一个位置抓取第一个单元格,而
s[“1”、“1”、“1”]
根据你的dim名称抓取第二行、第二列、第一个z平面。)谢谢你的回答,因为这个数组将形成三个矩阵,我希望第一个矩阵,第1行和第2列中的元素是0+1+1(j=0,k=1,I=1),但是我写的循环创建了一个NA。我想你没有领会我的意思。第1行
1
,第2列
2
,平面
1
中的元素与第1行
中的元素不同
,列
“2”
,平面
“1”
。当您使用字符串而不是数字时,对我来说效果很好。(
s[1,2,1]==2
对我来说是正确的。)
s3 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))

prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s3[] <- mapply(function(i,j,k) (j+i+k), prms$j, prms$k, prms$i)

identical(s1, s3)
#[1] TRUE
s4 <- array(NA, dim=c(5,5,4), dimnames=list(0:4,0:4,1:4))

prms <- expand.grid(j=0:4, k=0:4, i=1:4)
s4[] <- prms$j + prms$k + prms$i

identical(s1, s4)
#[1] TRUE