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 <hpa...@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: hpa...@fredhutch.org > Phone: (206) 667-5791 > Fax: (206) 667-1319 > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel