library(abind) options(error=function() NULL) x <- array(0, dim=c(2,3,4),dimnames=list(letters[1:2],LETTERS[1:3],letters[23:26])) # What we want to do here is get slices x[i,c("A","B"),c("w","x","y")] (for all i) # to be matrix(1:6,ncol=3). # If we assign in the standard way, and specify submatrices of the same shape in # indices and as the value of the assign (but leave some indices on the LHS empty), # then it is possible that submatrices do not end up being assigned to in the way # we might expect, because the RHS value is flattened and replicated. # This is only a problem when the repeating index has a lower dim number (here 1) # than the specified indices (here 2 and 3). x[,c("A","B"),c("w","x","y")] <- matrix(1:6,ncol=3) x[1,c("A","B"),c("w","x","y")] x[2,c("A","B"),c("w","x","y")] # Assign in a way so that the RHS has its elements laid out in the same way # as the LHS. x[,c("A","B"),c("w","x","y")] <- rep(matrix(1:6,ncol=3), each=2) # first slice x[1,c("A","B"),c("w","x","y")] # second slice x[2,c("A","B"),c("w","x","y")] # now do it with afill() x[] <- 0 afill(x, TRUE, , ) <- matrix(1:6,ncol=3, dimnames=list(c("A","B"),c("w","x","y"))) x[1,c("A","B"),c("w","x","y")] x[2,c("A","B"),c("w","x","y")] # mix up the order of the RHS of the assignment, afill will sort it back to match the LHS x[] <- 0 afill(x, T, , ) <- matrix(1:6,ncol=3, dimnames=list(c("A","B"),c("w","x","y")))[2:1,] x[1,c("A","B"),c("w","x","y")] x[2,c("A","B"),c("w","x","y")] table(x==0) # 4-d example x <- array(0, dim=c(2,3,3,4),dimnames=list(letters[1:2],LETTERS[1:3],letters[24:26],LETTERS[23:26])) x[1,c("A","B"),1,c("W","X","Y")] <- 1:6 x[1,c("A","B"),2,c("W","X","Y")] <- 1:6 x[1,c("A","B"),3,c("W","X","Y")] <- 1:6 x[2,c("A","B"),1,c("W","X","Y")] <- 1:6 x[2,c("A","B"),2,c("W","X","Y")] <- 1:6 x[2,c("A","B"),3,c("W","X","Y")] <- 1:6 c(x[1:2,c("A","B"),1:3,c("W","X","Y")]) c(matrix(1:6, ncol=3)[rep(1:2, each=2),rep(1:3,each=3)]) afill(x, T, , T, ) <- matrix(1:6,ncol=3, dimnames=list(c("A","B"),c("W","X","Y"))) x[1,c("A","B"),1,c("W","X","Y")] x[1,c("A","B"),2,c("W","X","Y")] x[1,c("A","B"),3,c("W","X","Y")] x[2,c("A","B"),1,c("W","X","Y")] x[2,c("A","B"),2,c("W","X","Y")] x[2,c("A","B"),3,c("W","X","Y")] table(x==0) # 2-d example x <- array(1:24, dim=c(6,4), dimnames=list(LETTERS[1:6], letters[23:26])) x1 <- x x1[2:4,2:3] <- -(1:6) x1 x1 <- x x1[LETTERS[2:4],letters[24:25]] <- -(1:6) x1 x2 <- x afill(x2) <- array(-(1:6),dim=c(3,2), dimnames=list(LETTERS[2:4],letters[24:25])) x2 identical(x1, x2) x2 <- x afill(x2) <- array(-(1:6),dim=c(3,2), dimnames=list(LETTERS[5:7],letters[24:25])) x2 <- x afill(x2,excess.ok=T) <- array(-(1:6),dim=c(3,2), dimnames=list(LETTERS[5:7],letters[24:25])) x2 x2 <- x afill(x2, local=T) <- array(-(1:6),dim=c(3,2), dimnames=list(LETTERS[2:4],letters[24:25])) x2 # 1-d named-vector example x <- c(A=0,B=0,C=0,D=0) afill(x) <- c(B=1,C=2) x # return value is the part of x that is assigned to (afill(x) <- c(B=1,C=2)) (x[2:3] <- 0)