[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