This function you wrote is interesting, but I almost missed it since I didn't see a direct example!
cubeValues(NULL, data, indices) cubeValues(1, data, indices) cubeValues(c(1,2), data, indices) (sorry if I'm beating a dead horse here) On Thu, Aug 4, 2011 at 2:58 PM, R. Michael Weylandt < michael.weyla...@gmail.com> wrote: > Hi Jannis, > > Like Gene, I'm not entirely sure what your code is intended to do, but it > wasn't hard to adapt mine to at least print out the desired slice through > the higher-dimensional array: > > cubeValues <- function(Insert, Destination, Location) { > Location = as.matrix(Location) > Location = array(Location,dim(Destination)) > if (is.null(Insert)) { > Destination = round(Destination,3) > Destination[!Location] = NA > print(Destination) > return(invisible()) > } > Destination[Location] <- Insert > return(Destination) > } > > If Insert = NULL, it adopts a printing rather than value assigning > behavior. > > > If you could indicate how you want the values when they come out, it's > pretty easy to adapt this to do whatever, but I can't just pull out > subarrays of arbitrary shape while keeping shape: e.g., > > x = matrix(1:4,2,2,byrow=T) > y = rbind(c(T,F),c(F,T)) > > > is(x[y]) > "vector" > > If you just want the values in a vector, take this version of my code: > > cubeValues <- function(Insert, Destination, Location) { > Location = as.matrix(Location) > Location = array(Location,dim(Destination)) > if (is.null(Insert)) { > return(Destination[Location]) > } > Destination[Location] <- Insert > return(Destination) > } > > It sounds like you've got what you want, but hopefully this will be of some > use to anyone who stumbles across this and, like Gene & myself, doesn't > really get your code. > > NB: I have not tested the provided code very much -- it relies on the > array() function to repeat Location as appropriate. If you know how R > repeats smaller arrays to make them fit big arrays, this should be fine for > you -- caveat code-or. > > Michael Weylandt > > PS -- The combinations() function of the gtools package might be of help to > you as well. We could get the entire example Gene got by > > ans = combinations(1:4,2,repeats.allowed=T) > rbind(cbind(ans,4),cbind(ans,1)) > > and it's probably not hard to simplify the entire code as desired. > > On Thu, Aug 4, 2011 at 6:33 AM, Jannis <bt_jan...@yahoo.de> wrote: > > > Thanks, Michael. I was, however, after a function I coul use for both > > extracting and replacing subarrays. In case anybody else stumbles over > this > > problem, here is my solution. Its programming is most probably horribly > > clumsy: > > > > > > ind.datacube = function( > > ##title<< create logical index matrices for multidimensional datacubes > > datacube ##<< array: datacube from which to extract the subparts > > , logical.ind ##<< logical array: TRUE/FALSE index matrix for a subset > of > > the dimensions > > ## of datacube. The size of logical.ind`s dimesnions > has > > to match the > > ## sizes of the corresponding dimesnions in datacube. > > , dims='auto' ##<< integer vector or 'auto' : indices of the dimensions > > in datacube corresponding > > ## to the dimensions of logical.ind. If set to 'auto' > > this matching is tried to > > ## be accomplished by comparing the sizes of the > > dimensions of the two objects. > > ) > > { > > if (sum(logical.ind) == 0) { > > stop('No TRUE value in index matrix!') > > } else { > > if (dims == 'auto') > > { > > if (is.null(dim(logical.ind)[1])) { > > size.ind = length(logical.ind) > > logical.ind = matrix(logical.ind,ncol=1) > > } else { > > size.ind = dim(logical.ind) > > } > > dims = match(size.ind, dim(datacube)) > > if (sum(duplicated(size.ind)) > 0 || sum(duplicated(dims)) > 0 > ) > > stop('dimensions do not match unambigously. Supply dims > > manually!') > > } > > dims.nonapply <- setdiff(1:length(dim(datacube)**),dims) > > ind.matrix <- which(logical.ind, arr.ind = TRUE) > > > > args.expand.grid <- list() > > counter = 1 > > for (i in 1: length(dim(datacube))) > > { > > if (is.element(i,dims.nonapply)) { > > args.expand.grid[[i]] = > 1:dim(datacube)[dims.nonapply[**i]] > > } else { > > args.expand.grid[[i]] = ind.matrix[,counter] > > counter = counter + 1 > > } > > } > > > > ind.all <- as.matrix(do.call(expand.grid, args.expand.grid)) > > ind.matrix <- ind.all[,order(c(dims.**nonapply,dims))] > > > > } > > ##value<< integer index matrix which can be used to index datacube > > ind.matrix > > > > } > > > > > > On 08/04/2011 12:12 AM, R. Michael Weylandt <michael.weyla...@gmail.com> > > wrote: > > > >> This might be a little late: but how about this (slightly clumsy) > >>> function: > >>> > >>> putValues<- function(Insert, Destination, Location) { > >>> Location = as.matrix(Location) > >>> Location = array(Location,dim(**Destination)) > >>> Destination[Location]<- Insert > >>> return(Destination) > >>> } > >>> > >>> It currently assumes that the location array lines up in dimension > order, > >>> but other than that seems to work pretty well. If you want, it > shouldn't > >>> be > >>> hard to change it to take in a set of dimensions to arrange Location > >>> along. > >>> If you like any of the other suggested behaviors, you could put in a > >>> is.null(Insert) option that returns the desired subset of values. I > >>> haven't > >>> tested it completely, but for a few sample inputs, it seems be do as > >>> desired. > >>> > >>> Michael > >>> > >>> > >>> On Wed, Aug 3, 2011 at 5:00 PM, Jannis<bt_jan...@yahoo.de> wrote: > >>> > >>> Thanks for all the replies!Unfortunately the solutions only work for > >>>> extracting subsets of the data (which was exactly what I was asking > for) > >>>> and > >>>> not to replace subsets with other values. I used them, however, to > >>>> program a > >>>> rather akward function to do that. Seems I found one of the few > aspects > >>>> where Matlab actually is slightly easier to use than R. > >>>> > >>>> > >>>> Thanks for your help! > >>>> Jannis > >>>> > >>>> On 08/01/2011 05:50 PM, Gene Leynes wrote: > >>>> > >>>> What do you think about this? > >>>>> > >>>>> apply(data, 3, '[', indices) > >>>>> > >>>>> > >>>>> On Mon, Aug 1, 2011 at 4:38 AM, Jannis<bt_jan...@yahoo.de> wrote: > >>>>> > >>>>> Dear R community, > >>>>> > >>>>>> > >>>>>> I have a general question regarding indexing in multidiemensional > >>>>>> arrays. > >>>>>> > >>>>>> Imagine I have a three dimensional array and I only want to extract > on > >>>>>> vector along a single dimension from it: > >>>>>> > >>>>>> > >>>>>> data<- array(rnorm(64),dim=c(4,4,4)) > >>>>>> > >>>>>> result<- data[1,1,] > >>>>>> > >>>>>> If I want to extract more than one of these vectors, it would now > >>>>>> really > >>>>>> help me to supply a logical matrix of the size of the first two > >>>>>> dimensions: > >>>>>> > >>>>>> > >>>>>> indices<- matrix(FALSE,ncol=4,nrow=4) > >>>>>> indices[1,3]<- TRUE > >>>>>> indices[4,1]<- TRUE > >>>>>> > >>>>>> result<- data[indices,] > >>>>>> > >>>>>> This, however would give me an error. I am used to this kind of > >>>>>> indexing > >>>>>> from Matlab and was wonderingt whether there exists an easy way to > do > >>>>>> this > >>>>>> in R without supplying complicated index matrices of all three > >>>>>> dimensions or > >>>>>> logical vectors of the size of the whole matrix? > >>>>>> > >>>>>> The only way I could imagine would be to: > >>>>>> > >>>>>> result<- data[rep(as.vector(indices),******times=4)] > >>>>>> > >>>>>> but this seems rather complicated and also depends on the order of > the > >>>>>> dimensions I want to extract. > >>>>>> > >>>>>> > >>>>>> I do not want R to copy Matlabs behaviour, I am just wondering > whether > >>>>>> I > >>>>>> missed one concept of indexing in R? > >>>>>> > >>>>>> > >>>>>> > >>>>>> Thanks a lot > >>>>>> Jannis > >>>>>> > >>>>>> ______________________________******________________ > >>>>>> R-help@r-project.org mailing list > >>>>>> https://stat.ethz.ch/mailman/******listinfo/r-help< > https://stat.ethz.ch/mailman/****listinfo/r-help> > >>>>>> <https://**stat.ethz.ch/mailman/****listinfo/r-help< > https://stat.ethz.ch/mailman/**listinfo/r-help> > >>>>>> > > >>>>>> <https://stat.**ethz.ch/**mailman/listinfo/r-**help< > http://ethz.ch/mailman/listinfo/r-**help> > >>>>>> <http**s://stat.ethz.ch/mailman/**listinfo/r-help< > https://stat.ethz.ch/mailman/listinfo/r-help> > >>>>>> > > >>>>>> PLEASE do read the posting guide http://www.R-project.org/** > >>>>>> posting-guide.html<http://www.****R-project.org/posting-guide.** > >>>>>> **html<http://www.R-project.**org/posting-guide.html< > http://www.R-project.org/posting-guide.html> > >>>>>> > > >>>>>> > >>>>>> and provide commented, minimal, self-contained, reproducible code. > >>>>>> > >>>>>> > >>>>>> ______________________________****________________ > >>>> R-help@r-project.org mailing list > >>>> https://stat.ethz.ch/mailman/****listinfo/r-help< > https://stat.ethz.ch/mailman/**listinfo/r-help> > >>>> <https://stat.**ethz.ch/mailman/listinfo/r-**help< > https://stat.ethz.ch/mailman/listinfo/r-help> > >>>> > > >>>> PLEASE do read the posting guide http://www.R-project.org/** > >>>> posting-guide.html<http://www.**R-project.org/posting-guide.**html< > http://www.R-project.org/posting-guide.html> > >>>> > > >>>> and provide commented, minimal, self-contained, reproducible code. > >>>> > >>>> > >>> > > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > 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. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list 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.