Hello, I am new to R (coming from Perl) and have what is, at least at this point, a philosophical question and a request for comment on some basic code. As I understand it - R emphasizes ,or at least supports, the functional programming model. I've come across some code that was markedly absent in for loops - and have been seeing some constructs that relate to functional programming and vectorized code (not that is at all unique to R of course). But I'm also new to the concept of vectorizing code. However, since I anticipate dealing with vectors of large sizes I think that this approach is probably going to serve well in terms of performance. As an example I anticipate having vector operations calling for shifting. I'll be shifting vectors to the right (or left) like below while maintaining the length and filling with zeros. Keep in mind I'll ultimately be dealing with vectors with very large length.>x <- c(0,3,2,1,0,0,0) >vlen <- length(x)[1] 7 One solution to accomplish the right shift is to do something like:>x=c(0,x[1:vlen-1]) >x1] 0 0 3 2 1 0 0 this does the trick though I'm wondering if this is in the spirit of "Vectorization". I could make recursive function that would cycle through the whole vector eventually leaving it full of 0s thus ending the recursion. Though does this capture the spirit of R programming and vectorizing ? Are there more primitive operators "closer" to the underlying C code that would serve performance interests better ? [[alternative HTML version deleted]]
Gabor Grothendieck
2011-Jan-22 12:10 UTC
[R] R - Vectorization and Functional Programming Constructs
On Fri, Jan 21, 2011 at 10:10 PM, Mingo <catojones at gmail.com> wrote:> Hello, I am new to R (coming from Perl) and have what is, at least at this > point, a philosophical question and a request for comment on some basic > code. As I understand it - R emphasizes ,or at least supports, the > functional programming model. I've come across some code that was markedly > absent in for loops - and have been seeing some constructs that relate to > functional programming and vectorized code (not that is at all unique to R > of course). But I'm also new to the concept of vectorizing code. > > However, since I anticipate dealing with vectors of large sizes I think that > this approach is probably going to serve well in terms of performance. As an > example I anticipate having vector operations ?calling for shifting. I'll be > shifting vectors to the right (or left) like below while maintaining the > length and filling with zeros. Keep in mind I'll ultimately be dealing with > vectors with very large length. > >>x <- c(0,3,2,1,0,0,0) >>vlen <- length(x) > [1] 7 > > One solution to accomplish the right shift is to do something like: > >>x=c(0,x[1:vlen-1]) >>x > 1] 0 0 3 2 1 0 0 > > this does the trick though I'm wondering if this is in the spirit of > "Vectorization". I could make recursive function that would cycle through > the whole vector eventually leaving it full of 0s thus ending the recursion. > Though does this capture the spirit of R programming and vectorizing ? Are > there more primitive operators "closer" to the underlying C code that would > serve performance interests better ? >If x is supposed to represent a time series that you are trying to align you would likely be better off to represent it as an object of one of the time series classes (ts, zoo, xts, timeSeries) and then use lag. That way you will not only have a convenient lag function but all the other functionality that you might need to conveniently handle such objects. lag is written in C in both zoo and xts and might be in timeSeries as well. If your series is regularly spaced and so applicable to ts then, internally, lagging only involves manipulating its "tsp" attribute so it would be extremely fast. -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com
Seemingly Similar Threads
- [cfe-dev] [RFC] Expose user provided vector function for auto-vectorization.
- RFC: Supporting the RISC-V vector extension in LLVM
- RFC: Supporting the RISC-V vector extension in LLVM
- RFC: Supporting the RISC-V vector extension in LLVM
- [RFC][SVE] Supporting SIMD instruction sets with variable vector lengths