[R] Vector-subsetting with ZERO - Is behavior changeable?

William Dunlap wdunlap at tibco.com
Wed Oct 5 18:44:08 CEST 2011


You can use [1] on the output of FUN to ensure that
exactly one value (perhaps NA from numeric(0)[1]) is
returned.  E.g.

  > index <- 1
  > sapply(list(c(1,2,3),c(1,2),c(1)),function(x){x[max(length(x)-index,0)][1]})
  [1]  2  1 NA

I'll also put in a plug for vapply, which throws an
error if FUN does not return what you expect it to:

  > vapply(list(c(1,2,3),c(1,2),c(1)),function(x){x[max(length(x)-index,0)]}, FUN.VALUE=numeric(1))
  Error in vapply(list(c(1, 2, 3), c(1, 2), c(1)), function(x) { : 
    values must be length 1,
   but FUN(X[[3]]) result is length 0
  > vapply(list(c(1,2,3),c(1,2),c(1)),function(x){x[max(length(x)-index,0)][1]}, FUN.VALUE=numeric(1))
  [1]  2  1 NA

For long input vectors vapply can save a fair bit of
memory and time over sapply.

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 

> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf Of Johannes
> Graumann
> Sent: Wednesday, October 05, 2011 4:29 AM
> To: r-help at stat.math.ethz.ch
> Subject: [R] Vector-subsetting with ZERO - Is behavior changeable?
> 
> Dear All,
> 
> I have trouble generizising some code.
> 
> > index <- 0
> > sapply(list(c(1,2,3),c(1,2),c(1)),function(x){x[max(length(x)-index,0)]})
> Will yield a wished for vector like so:
> [1] 3 2 1
> 
> But in this case (trying to select te second to last element in each vector
> of the list)
> > index <- 1
> > sapply(list(c(1,2,3),c(1,2),c(1)),function(x){x[max(length(x)-index,0)]})
> I end up with	
> [[1]]
> [1] 2
> 
> [[2]]
> [1] 1
> 
> [[3]]
> numeric(0)
> 
> I would (massively) prefer something like
> [1] 2 1 NA
> 
> My current implementation looks like
> > index <- 1
> > unlist(
> >  sapply(
> >   list(c(1,2,3),c(1,2),c(1)),
> >   function(x){
> >     value <- x[max(length(x)-index,0)]
> >     if(identical(value,numeric(0))){return(NA)} else {return(value)}
> >   }
> >  )
> > )
> [1]  2  1 NA
> 
> Quite the inelegant eyesore.
> 
> Any hints on how to do this better?
> 
> Thanks, Joh
> 
> ______________________________________________
> 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.



More information about the R-help mailing list