Re: [R] Vector-subsetting with ZERO - Is behavior changeable?
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?
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?
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.