Hi,

When a method is not defined for an object, you
expect to get an error. But this is not the case for
"names<-". You can use "names<-" on any S4 object: it
will remain silent, giving you the impression that it
actually did something:

  setClass("A", representation(vals="numeric"))
  setMethod("names", "A", function(x) names(x...@vals))

  > vals <- 8:2
  > names(vals) <- letters[1:7]
  > a <- new("A", vals=vals)
  > names(a)
  [1] "a" "b" "c" "d" "e" "f" "g"
  > names(a) <- LETTERS[1:7]         # no error
  > names(a)
  [1] "a" "b" "c" "d" "e" "f" "g"    # nothing has changed

Shouldn't "names<-" return an error like "[" or "[<-" do
in such situation?

  > a[2]
  Error in a[2] : object of type 'S4' is not subsettable
  > a[2] <- 55
  Error in a[2] <- 55 : object of type 'S4' is not subsettable

That would make it more convenient to implement classes where
instances have immutable names. For now I need to use the
following workaround:

setReplaceMethod("names", "A", function(x, value) stop("cannot set my names"))

  > names(a) <- LETTERS[1:7]
  Error in `names<-`(`*tmp*`, value = c("A", "B", "C", "D", "E", "F", "G" :
    cannot set my names

but that shouldn't be necessary.

Thanks!
H.

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

Reply via email to