On Fri, Feb 2, 2018 at 12:07 AM, Martin Maechler <maech...@stat.math.ethz.ch> wrote: >>>>>> Henrik Bengtsson <henrik.bengts...@gmail.com> >>>>>> on Thu, 1 Feb 2018 10:26:23 -0800 writes: > > > On Thu, Feb 1, 2018 at 12:14 AM, Martin Maechler > > <maech...@stat.math.ethz.ch> wrote: > >>>>>>> Michael Lawrence <lawrence.mich...@gene.com> > >>>>>>> on Tue, 30 Jan 2018 15:57:42 -0800 writes: > >> > >> > I just meant that the minimal contract for as.list() appears to be > that it > >> > returns a VECSXP. To the user, we might say that is.list() will > always > >> > return TRUE. > >> > >> Indeed. I also agree with Herv'e that the user level > >> documentation should rather mention is.list(.) |--> TRUE than > >> VECSXP, and interestingly for the experts among us, > >> the is.list() primitive gives not only TRUE for VECSXP but > >> also of LISTSXP (the good ole' pairlists). > >> > >> > I'm not sure we can expect consistency across methods > >> > beyond that, nor is it feasible at this point to match the > >> > semantics of the methods package. It deals in "class > >> > space" while as.list() deals in "typeof() space". > >> > >> > Michael > >> > >> Yes, and that *is* the extra complexity we have in R (inherited > >> from S, I'd say) which ideally wasn't there and of course is > >> not there in much younger languages/systems such as julia. > >> > >> And --- by the way let me preach, for the "class space" --- > >> do __never__ use > >> > >> if(class(obj) == "<classname>") > >> > >> in your code (I see this so often, shockingly to me ...) but rather use > >> > >> if(inherits(obj, "<classname>")) > >> > >> instead. > > > Second this one. But, soon (*) the former will at least give the > > correct answer when length(class(obj)) == 1 > > and produce an error > > otherwise. > > Not quite; I think you you did not get the real danger in using > 'class(.) == *': > What you say above would only be true if there were only S3 classes! > Try the following small R snippet > > myDate <- setClass("myDate", contains = "Date") > ## Object of class "myDate" > ## [1] "2018-02-02" > (d <- myDate(Sys.Date())) > class(d) == "Date" # is FALSE (hence of length 1) > inherits(d, "Date") # is TRUE > > > So, several of these cases will be caught at run-time in a > > near future. > > Maybe. But all the others are still wrong, as I show above.
Oh my, thanks for clarifying/emphasizing. I hope I didn't mislead too many people. I've been away from S4 for too long - I like to stay in the cozy S3 world :) /Henrik > Martin > > > (*) When _R_CHECK_LENGTH_1_CONDITION_=true becomes the default > > behavior - hopefully by R 3.5.0. > > >> > >> Martin ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel