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*)  ?

Kenn


On Sat, Jul 12, 2008 at 12:48 AM, Wolfgang Huber <[EMAIL PROTECTED]> 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
>>>> [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.
>

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

Reply via email to