[Rd] Dispatch mechanism seems to alter object before calling method on it

Michael Lawrence l@wrence@mich@el @ending from gene@com
Wed May 16 06:13:39 CEST 2018


My understanding is that array (or any other structure) does not
"simply" inherit from vector, because structures are not vectors in
the strictest sense. Basically, once a vector gains attributes, it is
a structure, not a vector. The methods package accommodates this by
defining an "is" relationship between "structure" and "vector" via an
"explicit coerce", such that any "structure" passed to a "vector"
method is first passed to as.vector(), which strips attributes. This
is very much by design.

Michael


On Tue, May 15, 2018 at 5:25 PM, Hervé Pagès <hpages at fredhutch.org> wrote:
> Hi,
>
> This was quite unexpected:
>
>   setGeneric("foo", function(x) standardGeneric("foo"))
>
>   setMethod("foo", "vector", identity)
>
>   foo(matrix(1:12, ncol=3))
>   # [1]  1  2  3  4  5  6  7  8  9 10 11 12
>
>   foo(array(1:24, 4:2))
>   # [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
> 24
>
> If I define a method for array objects, things work as expected though:
>
>   setMethod("foo", "array", identity)
>
>   foo(matrix(1:12, ncol=3))
>   #      [,1] [,2] [,3]
>   # [1,]    1    5    9
>   # [2,]    2    6   10
>   # [3,]    3    7   11
>   # [4,]    4    8   12
>
> So, luckily, I have a workaround.
>
> But shouldn't the dispatch mechanism stay away from the business of
> altering objects before passed to it?
>
> Thanks,
> H.
>
> --
> Hervé Pagès
>
> Program in Computational Biology
> Division of Public Health Sciences
> Fred Hutchinson Cancer Research Center
> 1100 Fairview Ave. N, M1-B514
> P.O. Box 19024
> Seattle, WA 98109-1024
>
> E-mail: hpages at fredhutch.org
> Phone:  (206) 667-5791
> Fax:    (206) 667-1319
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



More information about the R-devel mailing list