From jmc at r-project.org  Wed Jul 21 17:58:14 2010
From: jmc at r-project.org (John Chambers)
Date: Wed, 21 Jul 2010 08:58:14 -0700
Subject: [Rd] Extract callNextMethod "array" calls "matrix"?
In-Reply-To: <AANLkTinK5QfKH22WxpFwTiQfuqYI2RbUk4zrxkaPvpNo@mail.gmail.com>
References: <AANLkTinK5QfKH22WxpFwTiQfuqYI2RbUk4zrxkaPvpNo@mail.gmail.com>
Message-ID: <4C471916.6060104@r-project.org>

There does indeed seem to be a bug in the C code that implements 
callNextMethod, with the effect of adding a spurious index to calls to 
the primitive `[` code with more than 2 subscripts.

The message "incorrect number of dimensions" is telling the truth, the 
primitive code gets 4 subscripts instead of 3 (note the "x[i = i, j = j, 
NULL, ...]" in the error message).

Given the time of year, meetings, and the obscurity of this piece of 
code, the bug won't likely be fixed soon, so any workaround that avoids 
the use of callNextMethod on `[` with 3 or more subscripts is a good idea.

On 7/20/10 1:41 PM, Daniel Murphy wrote:
> I have a class that extends array and my method for "[" stops with an error:
>
>> setClass("A", contains="array")
> [1] "A"
>> setMethod("[", "A", function(x, i, j, ..., drop = TRUE) new("A",
> callNextMethod()))
> [1] "["
>> a<-new("A",array(1:12,c(4,3,1)))
>> a
> An object of class "A"
> , , 1
>
>       [,1] [,2] [,3]
> [1,]    1    5    9
> [2,]    2    6   10
> [3,]    3    7   11
> [4,]    4    8   12
>
>> a[1:2,2:3,1]
> Error in x[i = i, j = j, NULL, ...] : incorrect number of dimensions
> Error in callNextMethod() : error in evaluating a 'primitive' next method
>>
>
> A similar error does not occur when extending a matrix:
>> setClass("M", contains="matrix")
> [1] "M"
>> setMethod("[", "M", function(x, i, j, ..., drop = TRUE) new("M",
> callNextMethod()))
> [1] "["
>> a<-new("M",matrix(1:12,4,3))
>> a[1:2,2:3]
> An object of class "M"
>       [,1] [,2]
> [1,]    5    9
> [2,]    6   10
>>
>
> Is there a problem with my method definition for the array-extending class?
>
> My work-around is as follows:
>> setMethod("[", "A", function(x, i, j, ..., drop = TRUE) new("A",
> `[`(as(x,"array"), i=i, j=j, ..., drop=drop)))
> [1] "["
>> a[1:2,2:3,1]
> An object of class "A"
>       [,1] [,2]
> [1,]    5    9
> [2,]    6   10
>>
>
> Cheers,
> Dan
>
> 	[[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] Extract callNextMethod "array" calls "matrix"?
John Chambers