Hi Hervé, thank you very much for your reply! This makes the different treatment of S3 and S4 objects by 'class' clear.
Best Simon On Jul 23, 2013, at 7:20 PM, Hervé Pagès <hpa...@fhcrc.org> wrote: > Hi, > > On 07/23/2013 09:59 AM, Simon Zehnder wrote: >> Hi David, >> >> thanks for the reply. You are right. Using the %in% is more stable and I >> gonna change my code. > > Unlike with S3 objects, class() on an S4 object can only return 1 class. > > Also note that, on an S3 object, doing > > "firstClass" %in% class(myObject) > > is equivalent to doing inherits(myObject, "firstClass"), which is > what you said you wanted to avoid. The most specific class should be > the first so if that's what you wanted to check, you could do > > class(myObject)[1] == "firstClass" > > But that precaution is not needed if 'myObject' is guaranteed to be > an S4 object (although when writing a unit test, one should probably > discard any guarantee of that sort). > > Cheers, > H. > > >> >> When testing for a specific class using 'is' one has to start at the lowest >> heir and walk up the inheritance structure. Starting at the checks at the >> root will always give TRUE. Having a structure which is quite complicated >> let me move to the check I suggested in my first mail. >> >> Best >> >> Simon >> >> On Jul 23, 2013, at 6:15 PM, David Winsemius <dwinsem...@comcast.net> wrote: >> >>> >>> On Jul 23, 2013, at 5:36 AM, Simon Zehnder wrote: >>> >>>> Dear R-Users and R-Devels, >>>> >>>> I have large project based on S4 classes. While writing my unit tests I >>>> found out, that 'is' cannot test for a specific class, as also inherited >>>> classes can be treated as their super classes. I need to do checks for >>>> specific classes. What I do right now is sth. like >>>> >>>> if (class(myClass) == "firstClass") { >>> >>> I would think that you would need to use `%in%` instead. >>> >>> if( "firstClass" %in% class(myObject) ){ >>> >>> Objects can have more than one class, so testing with "==" would fail in >>> those instances. >>> >>> >>>> >>>> } else if (class(myClass) == "secondClass") { >>>> >>>> } >>>> >>>> Is this the usual way how classes are checked in R? >>> >>> Well, `inherits` IS the usual way. >>> >>>> I was expecting some specific method (and 'inherits' or 'extends' is not >>>> what I look for)... >>>> >>>> >>>> Best >>>> >>>> Simon >>>> >>>> [[alternative HTML version deleted]] >>> >>> Plain-text format is the recommended format for Rhelp >>> >>> -- >>> David Winsemius >>> Alameda, CA, USA >>> >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. >> > > -- > 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-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.