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

Johannes Graumann johannes_graumann at web.de
Mon Oct 10 09:43:45 CEST 2011


Thank you very much. Learned something again!

Joh

William Dunlap wrote:

> 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