[R] Generic 'diff'

Wacek Kusnierczyk Waclaw.Marcin.Kusnierczyk at idi.ntnu.no
Tue May 19 10:46:08 CEST 2009


Wacek Kusnierczyk wrote:
> Stavros Macrakis wrote:
>   
>>

[...]
>> I am not talking about creating a new class with an analogue to the
>> subtraction function.  I am talking about a function which applies another
>> function to a sequence and its lagged version.
>>
>> Functional arguments are used all over the place in R's base package
>> (Xapply, sweep, outer, by, not to mention Map,  Reduce, Filter, etc.) and
>> they seem perfectly natural here.
>>   
>>     
>
>   
[...]

> as you say, it's trivial to implement an extended diff, say difff,
> reusing code from diff:
>
>     difff = function(x, ...)
>        UseMethod('difff')
>     difff.default = function(x, lag=1, differences=1, fun=`-`, ...) {
>        ismat = is.matrix(x)
>        xlen = if (ismat) dim(x)[1L] else length(x)
>     if (length(lag) > 1L || length(differences) > 1L || lag < 1L ||
> differences < 1L)
>        stop("'lag' and 'differences' must be integers >= 1")
>   

btw., the error message here is confusing:

    lag = 1:2
    diff(1:10, lag=lag)
    # Error in diff.default(1:10, lag = lag) :
    #  'lag' and 'differences' must be integers >= 1

    is.integer(lag)
    # TRUE
    all(lag >= 1)
    # TRUE
  
what is meant is that lag and differences must be atomic 1-element
vectors of positive integers.  or rather integer-representing numerics:

    lag = 1
    diff(1:5, lag=1)
    # fine
    is.integer(lag)
    # FALSE

(the usual confusion between 'integer' as the underlying representation
and 'integer' as the represented number.)

vQ




More information about the R-help mailing list