From: Georgi Boshnakov <georgi.boshnakov_at_manchester.ac.uk>

Date: Thu, 15 Nov 2012 12:43:35 +0000

Date: Thu, 15 Nov 2012 12:43:35 +0000

Hi,

> ... Wrong. It looks like internally a[[1]] is always used instead of a[[i]].

*> The real problem it seems is that 'a' is treated as if it was of
**> ength 1:
**>
**> > mapply(function(x, y) {x * y}, a, 1:3)
**> [1] 101 202 303
**> > mapply(function(x, y) {x * y}, a, 5)
**> [1] 505
**>
**> In other words, internal dispatch works for [[ but not for length().
*

Documentation of mapply says

*> Arguments are recycled if necessary.
*

So, the function seems to work as documented.

One may be tempted to expect that what 'length()' says should take precedence but
the '...' arguments in 'mapply' are documented as

*> ...: arguments to vectorize over (vectors or lists of strictly
**> positive length, or all of zero length).
*

So, the defining feature is that the arguments are vectors. Since class A is not defined as a vector class, object 'a' is a scalar (vector of length 1 in R) and therefore recycled.

It is probably not a good idea to redefine length() for class A without making it a subclass of 'vector' (or something equivalent) since doing so redefines a fundamental basic feature behind R's back.

Best regards,

Georgi

-- Dr Georgi Boshnakov tel: (+44) (0)161 306 3684 School of Mathematics fax: (+44) (0)161 306 3669 Alan Turing Building 1.125 The University of Manchester email: Georgi.Boshnakov_at_manchester.ac.uk Oxford Road Manchester M13 9PL UK Message: 7 Date: Wed, 14 Nov 2012 21:42:07 -0800 From: Herv? Pag?s <hpages_at_fhcrc.org> To: R-devel_at_r-project.org Subject: [Rd] bug with mapply() on an S4 object Message-ID: <50A480AF.1030901@fhcrc.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Hi, Starting with ordinary vectors, so we know what to expect: > mapply(function(x, y) {x * y}, 101:106, rep(1:3, 2)) [1] 101 204 309 104 210 318 > mapply(function(x, y) {x * y}, 101:106, 1:3) [1] 101 204 309 104 210 318 Now with an S4 object: setClass("A", representation(aa="integer")) a <- new("A", aa=101:106) > length(a) [1] 1 Implementing length(): setMethod("length", "A", function(x) length(x_at_aa)) Testing length(): > length(a) # sanity check [1] 6 No [[ yet for those objects so the following error is expected: > mapply(function(x, y) {x * y}, a, rep(1:3, 2)) Error in dots[[1L]][[1L]] : this S4 class is not subsettable Implementing [[: setMethod("[[", "A", function(x, i, j, ...) x_at_aa[[i]]) Testing [[: > a[[1]] [1] 101 > a[[5]] [1] 105 Trying mapply again: > mapply(function(x, y) {x * y}, a, rep(1:3, 2)) [1] 101 202 303 101 202 303 Wrong. It looks like internally a[[1]] is always used instead of a[[i]]. The real problem it seems is that 'a' is treated as if it was of length 1: > mapply(function(x, y) {x * y}, a, 1:3) [1] 101 202 303 > mapply(function(x, y) {x * y}, a, 5) [1] 505 In other words, internal dispatch works for [[ but not for length(). 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_fhcrc.org Phone: (206) 667-5791 Fax: (206) 667-1319 ______________________________________________ R-devel_at_r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-develReceived on Thu 15 Nov 2012 - 13:12:18 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

*
Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.
Archive generated by hypermail 2.2.0, at Fri 16 Nov 2012 - 14:50:52 GMT.
*

*
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel.
Please read the posting
guide before posting to the list.
*