From p.dalgaard at biostat.ku.dk  Wed Nov 23 13:57:14 2005
From: p.dalgaard at biostat.ku.dk (Peter Dalgaard)
Date: 23 Nov 2005 13:57:14 +0100
Subject: [Rd] x[1,], x[1,,], x[1,,,], ...
In-Reply-To: <4384498B.1080401@maths.lth.se>
References: <4384498B.1080401@maths.lth.se>
Message-ID: <x2oe4br07p.fsf@viggo.kubism.ku.dk>

Henrik Bengtsson <hb at maths.lth.se> writes:

> Hi,
> 
> is there a function in R already doing what I try to do below:
> 
> # Let 'x' be an array with *any* number of dimensions (>=1).
> x <- array(1:24, dim=c(2,2,3,2))
> ...
> x <- array(1:24, dim=c(4,3,2))
> 
> i <- 2:3
> 
> ndim <- length(dim(x))
> if (ndim == 1)
>    y <- x[i]
> else if (ndim == 2)
>    y <- x[i,]
> else if (ndim == 3)
>    y <- x[i,,]
> else ...
> 
> and so on.  My current solution is
> 
> ndim <- length(dim(x))
> args <- rep(",", ndim)
> args[1] <- "i"
> args <- paste(args, collapse="")
> code <- paste("x[", args, "]", sep="")
> expr <- parse(text=code)
> y <- eval(expr)
> 
> ndim <- length(dim(x))
> args <- rep(",", ndim)
> args[1] <- "i"
> args <- paste(args, collapse="")
> code <- paste("x[", args, "]", sep="")
> expr <- parse(text=code)
> y <- eval(expr)
> 
> Is there another way I can do this in R that I have overlooked?

I think this should work:

x <- array(1:24, dim=c(3,2,2,2)) # not c(2,2,3,2)....
i <- 2:3
ndim <- length(dim(x))
ix <- as.list(rep(TRUE, ndim))
ix[[1]] <- i
do.call("[", c(list(x), ix))


-- 
   O__  ---- Peter Dalgaard             ?ster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907



[Rd] x[1,], x[1,,], x[1,,,], ...
Peter Dalgaard