Kenn Konstabel wrote:
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


Dear Kenn,

I can:

> do.call("[", list(x,1,2,TRUE))
[1]  3  9 15 21

See also http://134.148.236.121/R/help/06/01/19403.html


In principle this works also for assignment, but the following benchmark shows a big performance hit:

x = array(1:1e6, dim=c(100,100,100))

system.time({
  for(i in 1:100)  x = do.call("[<-", list(x, i, 2, TRUE, pi))
})

system.time({
  for(i in 1:100)  x[i, 2, ] <- pi
})

The first takes ~2sec on my computer, the second 8ms, and I wonder whether someone knows how to use the "clever" behaviour of "[<-" also when it is called with do.call?

 Best wishes
        Wolfgang


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




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



______________________________________________
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