From: Kenn Konstabel <lebatsnok_at_gmail.com>

Date: Sat, 12 Jul 2008 01:07:19 +0300

R-help_at_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. Received on Fri 11 Jul 2008 - 22:11:56 GMT

Date: Sat, 12 Jul 2008 01:07:19 +0300

What is "wrong" is, I think, that you can't write a substitute for x[1,2,] this way. (Or, in general, empty indexes won't work.)

A related question - Is there a way to replace x[1,2,] with "["(1,2, *something clever*) ?

On Sat, Jul 12, 2008 at 12:48 AM, Wolfgang Huber <huber_at_ebi.ac.uk> wrote:

*>
*

> 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
**>>>> patrick_at_burns-stat.com
**>>>> +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_at_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_at_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. Received on Fri 11 Jul 2008 - 22:11:56 GMT

Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.

Archive generated by hypermail 2.2.0, at Fri 11 Jul 2008 - 23:31:28 GMT.

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help.
Please read the posting
guide before posting to the list.
*