[R] Correct way to handle class

Marc Girondot m@rc_grt @end|ng |rom y@hoo@|r
Thu Apr 14 12:34:24 CEST 2022


Dear member of the list,

I search for the correct way to handle class.

I learn recently that inherits() was the correct way to test class:

inherits(x, what, which = FALSE)

For this part it is ok.

But now I have questions about the correct procedure to set class.

Previously I used:

result <- "Je suis donc je pense"
class(result) <- "ECFOCF"

But I loose the previous class "character". It is still present in 
mode(result) but sometimes it can be a problem.

For example here:

 > resultL <- data.frame(A=c(1,2), B=c(3, 4))
 > class(resultL)
[1] "data.frame"
 > class(resultL) <- "ECFOCF"
 > resultL
$A
[1] 1 2

$B
[1] 3 4

attr(,"class")
[1] "ECFOCF"
attr(,"row.names")
[1] 1 2

I lost the data.frame structure when I set the new class. It is seen as 
a list by:

 > mode(resultL)
[1] "list"

So I use:

result <- "Je suis donc je pense"
class(result) <- unique(append("ECFOCF", class(result)))

I use append because I don't want loose the original class. I use 
unique() to prevent the same class being put several times in the object.

However, Using this formula, I am not 100% sure the "ECFOCF" is the 
first class. If it is not, it could prevent plot.ECFOCF to take in 
charge the plot of this object.

An alternative could be:

 > result <- "Je suis donc je pense"
 > class(result) <- unique(append("ECFOCF", class(result)[class(result) 
!= "ECFOCF"]))
 > class(result)
[1] "ECFOCF"    "character"

Then I am sure that "ECFOCF" class is the first one.

Is it the correct way to define class or I am in wrong direction?

Thanks a lot

Marc



More information about the R-help mailing list