[R] How to avoid switching on input type?

2009-03-21 Thread Ken-JP

Hi,

I need some help improving this ugly code I wrote.  I would like to shift
forward a zoo object, matrix, ts, or list by shift items (default 1) and
fill the holes with 0's.  

The code below works, but it looks ugly.  I could write a function
lag.zerofill() which calls the two functions below depending on the class()
of the item passed in, but that feels very unlike R.

What is the proper way to write this code so that it works for all input
types?  

Is a switch depending on the input type really necessary?  I am hoping the
answer is no.

Thanks in advance.

- Ken

#
---

require( zoo );

inp - c( 5, 9, 4, 2, 1 ); inp2 - c( 6, 6, 0, 4, 2 );
inp.zoo - zoo( cbind( inp, inp2 ), as.Date(2003-02-01) +
(0:(length(inp)-1)));

lag.zerofill.list - function( m, shift=1, ...) {
  c( rep(0,shift), m[-((length(m)-shift+1):length(m))] );
}
  
lag.zerofill.zoo - function( m, shift=1, ...) {
  k - rbind( m[1:shift,], lag(m,-(shift))); k[1:shift,] - 0; k; 
}

lag.zerofill.list( inp ) # works ok
lag.zerofill.zoo( inp.zoo ) # works ok

-- 
View this message in context: 
http://www.nabble.com/How-to-avoid-switching-on-input-type--tp22637249p22637249.html
Sent from the R help mailing list archive at Nabble.com.

__
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] How to avoid switching on input type?

2009-03-21 Thread Gabor Grothendieck
Create an S3 generic lag.zerofill and then define methods for each class:

lag.zerofill - function(x, k = 1, ...) UseMethod(lag.zerofill)
lag.zerofill.zoo - function(x, k, ...) {
m - merge(x, lag(x, k), fill = 0)
structure(m[, -(1:ncol(x))], dimnames = list(NULL, colnames(x)))
}
# lag.zerofill.list - ...

# test
lag.zerofill(inp.zoo, -1)

Running the above gives (last line shown only):

 lag.zerofill(inp.zoo, -1)
   inp inp2
2003-02-01   00
2003-02-02   56
2003-02-03   96
2003-02-04   40
2003-02-05   24


On Sat, Mar 21, 2009 at 11:47 AM, Ken-JP kfmf...@gmail.com wrote:

 Hi,

 I need some help improving this ugly code I wrote.  I would like to shift
 forward a zoo object, matrix, ts, or list by shift items (default 1) and
 fill the holes with 0's.

 The code below works, but it looks ugly.  I could write a function
 lag.zerofill() which calls the two functions below depending on the class()
 of the item passed in, but that feels very unlike R.

 What is the proper way to write this code so that it works for all input
 types?

 Is a switch depending on the input type really necessary?  I am hoping the
 answer is no.

 Thanks in advance.

 - Ken

 #
 ---

 require( zoo );

 inp - c( 5, 9, 4, 2, 1 ); inp2 - c( 6, 6, 0, 4, 2 );
 inp.zoo - zoo( cbind( inp, inp2 ), as.Date(2003-02-01) +
 (0:(length(inp)-1)));

 lag.zerofill.list - function( m, shift=1, ...) {
  c( rep(0,shift), m[-((length(m)-shift+1):length(m))] );
 }

 lag.zerofill.zoo - function( m, shift=1, ...) {
  k - rbind( m[1:shift,], lag(m,-(shift))); k[1:shift,] - 0; k;
 }

 lag.zerofill.list( inp ) # works ok
 lag.zerofill.zoo( inp.zoo ) # works ok

 --
 View this message in context: 
 http://www.nabble.com/How-to-avoid-switching-on-input-type--tp22637249p22637249.html
 Sent from the R help mailing list archive at Nabble.com.

 __
 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.