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

2011-10-10 Thread Johannes Graumann
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-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
 On Behalf Of Johannes Graumann
 Sent: Wednesday, October 05, 2011 4:29 AM
 To: r-h...@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@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.


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

2011-10-05 Thread Johannes Graumann
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@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.


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

2011-10-05 Thread William Dunlap
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-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On 
 Behalf Of Johannes
 Graumann
 Sent: Wednesday, October 05, 2011 4:29 AM
 To: r-h...@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@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.