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@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@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: hpa...@fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to