On 2026-01-04 7:35 p.m., Bert Gunter wrote:
Could someone explain the following behavior to me, which I find
inconsistent and confusing:

inherits(1L, "integer")
[1] TRUE    **as expected. S3 class**
inherits(1L, class_integer)
[1] TRUE  ** as expected. S7 base class**



[1] FALSE   ** There is no "double" class in S3
inherits(1.0, "numeric")
[1] TRUE ** doubles are S3 class "numeric". This is (sort of) documented**

BUT ...
inherits(1.0, class_double)
[1] FALSE  ** because there is no S3 class "double" ?? **

inherits(1.0, class_numeric)
Error in inherits(1.2, class_numeric) :
   'what' must be a character vector or an object with a nameOfClass() method
**class_numeric is an S7 union, not an S7 base class ?**

So if 1.0 is not class_double, what base class is it? And how should I test
for the class of a non-integer numeric? And what is class_double then?

My apologies if this is obvious, but as I said, I find this confusing.

It's documented that

  inherits(1.0, class_double)

should execute

  inherits(1.0, "double")

because nameOfClass(class_double) is "double". So things are consistent because you found

  inherits(1.0, "double") == inherits(1.0, class_double)

And nameOfClass(class_numeric) is NULL, because the S7 authors haven't given a way for an S7 union to have an S3 class name.

So I think you are right to be confused, but the only solution I can think of (allowing S7 unions to have S3 names) might be seen as just too much trouble. Are there any other cases where an S7 union corresponds to an S3 class?

Duncan Murdoch

______________________________________________
[email protected] mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to