Hi Richard,

what is wrong with Patrick's suggestion? I get

x <- array(1:24, dim=2:4)
x[rbind(c(1,1,2))]
## [1] 7
x[rbind(c(1,1,2))] <- 13
x[rbind(c(1,1,2))]
## [1] 13

And you could also do

  do.call("[", list(x,1,1,2))

These should be a bit quicker than the eval/parse constructs - see also         
        library("fortunes")
        fortune(106)

Also note that your "subsetArray<-" function will afaIu each time copy (and then modify) the whole array, which may be quite inefficient. I believe that the "[<-" function has been optimized to avoid that in some cases. Try

 x=numeric(1e6); system.time({for (i in 1:1000) x[i]=12})

versus

 x=numeric(1e6); system.time({for (i in 1:1000) {y=x; y[i]=12}})

        Best wishes
        Wolfgang

----------------------------------------------------
Wolfgang Huber, EMBL-EBI, http://www.ebi.ac.uk/huber




Richard Pearson wrote:
In case anyone's still interested, I now have (I think!) a complete solution (thanks to a quick look at my new favourite document - S Poetry :-)

subsetArray <- function(x, subset) {
  subsetString <- paste(subset, collapse=",")
  subsetString <- gsub("NA","",subsetString)
  evalString <- paste(expression(x), "[", subsetString, "]")
  eval(parse(text=evalString))
}

"subsetArray<-"<- function(x, subset, value) {
  subsetString <- paste(subset, collapse=",")
  subsetString <- gsub("NA","",subsetString)
evalString <- paste(expression(x), "[", subsetString, "] <-", expression(value))
  eval(parse(text=evalString))
  x
}

x <- array(1:24, dim=2:4)
subsetArray(x, c(1,1,2))
subsetArray(x, c(1,1,2)) <- 25
x

Thanks to Pat!

Richard


Richard Pearson wrote:
My understanding of matrix subscripting is that this can be used to access arbitrary elements from an array and return them as a vector, but I don't understand how that helps me here. I've now written a function that seems to do what I originally wanted, but I've also realised I want to do assignment too. I need to read up more on writing assignment functions to do this. However, I'm thinking that someone has already solved this, in a far more elegant way than my hacking :-). Here's my function for anyone interested:

subsetArray <- function(x, subset) {
+   subsetString <- paste(subset, collapse=",")
+   subsetString <- gsub("NA","",subsetString)
+   evalString <- paste(expression(x), "[", subsetString, "]")
+   eval(parse(text=evalString))
+ }
x <- array(1:24, dim=2:4)
subsetArray(x, c(1,1,2))
[1] 7
subsetArray(x, c(1,NA,2))
[1]  7  9 11
subsetArray(x, c(1,NA,NA))
    [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    3    9   15   21
[3,]    5   11   17   23

subsetArray(x, c(1,1,2)) <- 25
Error in subsetArray(x, c(1, 1, 2)) <- 25 : could not find function "subsetArray<-"

Best wishes

Richard.


Patrick Burns wrote:
I think you are looking for subscripting with a
matrix:

x[cbind(1,1,2)]

See, for instance, the subscripting section of chapter 1
of S Poetry.


Patrick Burns
[EMAIL PROTECTED]
+44 (0)20 8525 0696
http://www.burns-stat.com
(home of S Poetry and "A Guide for the Unwilling S User")

Richard Pearson wrote:
Hi

Is it possible to subset an n-dimensional array by a vector of n dimensions? E.g. assume I have

x <- array(1:24, dim=2:4)
x[1,1,2]
[1] 7
dims <- c(1,1,2)

I would like a function that I can supply x and dims as parameters to, and have it return 7. Also, I would like to do something like:

x[1,1,]
[1]  1  7 13 19
dims2<- c(1,1,NA)

And have a function of x and dims2 that gives me back [1]  1  7 13 19

Does such a thing exist?

Thanks

Richard

______________________________________________
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.

Reply via email to