[prev in list] [next in list] [prev in thread] [next in thread] 

List:       r-help
Subject:    Re: [R] Arrays of variable dimensionality
From:       Henrik Bengtsson <henrik.bengtsson () ucsf ! edu>
Date:       2015-05-31 3:20:52
Message-ID: CAFDcVCQipL8WUzWYVkXJS8Heo-mcnhvE=c4LBZT=Goxg2qvcTA () mail ! gmail ! com
[Download RAW message or body]

Basically dropping by saying what's already been said, but also that
you probably want to do whatever you're trying to achieve using
vectorized operations.  A small summary with some tweaks:

## Generate an array with a "random" number of dimensions
dim <- c(4, 5, 6, 7)
dimnames <- lapply(1:4, FUN=function(i) sprintf("%s%d", letters[i], 1:dim[i])
)
x <- array(seq_len(prod(dim)), dim=dim, dimnames=dimnames)

# A single cell
> y0 <-x[1,2,3,4]
> y <- do.call(`[`, c(list(x), alist(1,2,3,4)))
> y
[1] 405
> stopifnot(identical(y, y0))

# A "block" subset of the array
> y0 <- x[1:2,2,3:4,4]
> y <- do.call(`[`, c(list(x), alist(1:2,2,3:4,4)))
> y
    c3  c4
a1 405 425
a2 406 426
> stopifnot(identical(y, y0))

# A "block" subset of the array (preserving all 4 dimensions)
> y0 <- x[1:2,2,3:4,4, drop=FALSE]
> y <- do.call(`[`, c(list(x), alist(1:2,2,3:4,4), drop=FALSE))
> str(y)
 int [1:2, 1, 1:2, 1] 405 406 425 426
 - attr(*, "dimnames")=List of 4
  ..$ : chr [1:2] "a1" "a2"
  ..$ : chr "b2"
  ..$ : chr [1:2] "c3" "c4"
  ..$ : chr "d4"
> stopifnot(identical(y, y0))

# Why alist() and not list()?  Because if you also need to do ...
> y0 <- x[1:2,,1:2,, drop=FALSE]
> y <- do.call(`[`, c(list(x), alist(1:2,,1:2,), drop=FALSE))
> str(y)
 int [1:2, 1:5, 1:2, 1:7] 1 2 5 6 9 10 13 14 17 18 ...
 - attr(*, "dimnames")=List of 4
  ..$ : chr [1:2] "a1" "a2"
  ..$ : chr [1:5] "b1" "b2" "b3" "b4" ...
  ..$ : chr [1:2] "c1" "c2"
  ..$ : chr [1:7] "d1" "d2" "d3" "d4" ...
> stopifnot(identical(y, y0))

# Any subset of cells - not a "block" (using what is called "matrix
indexing" in R)
> y0 <- c(x[1,2,2,4], x[3,2,1,3])
> idxs <- cbind(c(1,3), c(2,2), c(2,1), c(4,3))
> y <- x[idxs]
[1] 385 247
> stopifnot(identical(y, y0))


For a (possibly) more readable subsetting by "blocks" than using
do.call(), there's also:

> library(R.utils)
> y <- extract(x, indices=list(1:2,2,3:4,4), drop=TRUE)
> y <- extract(x, indices=list(1:2,2,3:4,4), drop=FALSE)

It also has some other bells and whistles, but it cannot do more than
what already shown above.

/Henrik
(author of R.utils)

On Sat, May 30, 2015 at 10:34 AM, Jeff Newmiller
<jdnewmil@dcn.davis.ca.us> wrote:
> Don't.
> 
> Arrays in R don't have variable dimensions [1]. To the extent that you pretend \
> otherwise, you will degrade performance and complicate your program. I would argue \
> that similar effects arise in languages that do let you pretend that arrays have \
> variable dimensions. 
> The main reason variable-sized arrays seem useful is that some algorithms or data \
> sources yield variable amounts of data. There are various ways to handle these \
> cases, and the use of lists to hold intermediate units of data followed by transfer \
> of that data into an array (strategically handled after you know how big the array \
> has to be) is one of the more common ones. 
> Another technique is to use one of the ragged array or sparse matrix data \
> structures, but they generally work best when the data actually are sparse. 
> Being more specific about your immediate problem can elicit more specific help.
> 
> BTW please post plain text on this list... HTML is not supported by the list \
> reflector and leads to misunderstandings. 
> [1] More precisely, the total number of elements in the underlying vector is fixed, \
> though you can redefine how the dimensions use the elements in that vector. For \
>                 example, study the "aperm" function.
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go Live...
> DCN:<jdnewmil@dcn.davis.ca.us>        Basics: ##.#.       ##.#.  Live Go...
> Live:   OO#.. Dead: OO#..  Playing
> Research Engineer (Solar/Batteries            O.O#.       #.O#.  with
> /Software/Embedded Controllers)               .OO#.       .OO#.  rocks...1k
> ---------------------------------------------------------------------------
> Sent from my phone. Please excuse my brevity.
> 
> On May 30, 2015 3:29:09 AM PDT, WRAY NICHOLAS <nicholas.wray@ntlworld.com> wrote:
> > Hello folks
> > 
> > Supposing I have a multidimensional array in an R prog, say a 4D array.
> > 
> > I want the coordinate quantities to be read off from a vector.  The
> > values
> > in the vector (vec) are generated by a function.
> > 
> > This is easy if the number of dimensions is fixed for both the array
> > and
> > the number of elements in the  vector (say 4):
> > 
> > X<-array[vec[1],vec[2],vec[3],vec[4]]
> > 
> > But if the number of dimensions of the array is not fixed and can
> > change
> > during the course of the prog I am stuck as to how to do this, as I
> > don't
> > know a way of feeding a vector or list of unspecified beforehand length
> > into the coordinates for an array
> > 
> > I can't find anything useful about this on the net
> > 
> > Does anyone have any ideas?
> > Thanks, Nick
> > 
> > [[alternative HTML version deleted]]
> > 
> > ______________________________________________
> > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide
> > http://www.R-project.org/posting-guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic