Dear Martin, On 11/09/2019 09:56, Martin Maechler wrote: > > > I wonder if data.frame(<some non-empty data>) == NULL should also > return > > a value instead of an error. R help reads: > > > "At least one of |x| and |y| must be an atomic vector, but > > if the other is a list R attempts to coerce it to the > > type of the atomic vector: this will succeed if the list > > is made up of elements of length one that can be coerced > > to the correct type. > > > If the two arguments are atomic vectors of different > > types, one is coerced to the type of the other, the > > (decreasing) order of precedence being character, complex, > > numeric, integer, logical and raw." > > > It is not clear from the help what to expect for NULL or > > empty atomic vectors. > > Well, strictly speaking an error would be expected for NULL, > as it is *not* an atomic vector, and your main issue > > " data.frame(..) == NULL " > > would already be settled by the first half sentence from the > doc, and strictly speaking, even data.frame(NULL) == NULL > "should" return an error ((Note: I'm not saying it really > should, but at least the reference does not say it should work at all)) Thanks, this explanation makes total sense to me. I did not consider that NULL might be non-atomic. Strangely, is.atomic(NULL) returns TRUE. On the other hand, I understand that one would not like to treat it like atomic in ==.
However, in this case one might expect that the error message would be more like that for S4 objects (which always seem to report an informative error message for ==): > Pos <- setClass("Pos", slots = c(latitude = "numeric", longitude = "numeric", altitude = "numeric")) > p = Pos() > p == NULL Error in p == NULL : comparison (1) is possible only for atomic and list types > p == "FOO" Error in p == "FOO" : comparison (1) is possible only for atomic and list types In the data.frame()==NULL cases I have the impression that the fact that both sides are non-atomic is not properly detected and therefore R tries to go on with the == method for data.frames. From a cursory check in Ops.data.frame() and some debugging I have the impression that the case of the second argument being non-atomic or empty is not handled at all and the function progresses until the end, where it fails in the last step on an empty value: matrix(unlist(value, recursive = FALSE, use.names = FALSE), nrow = nr, dimnames = list(rn, cn)) Best regards, Hilmar -- Dr. Hilmar Berger, MD Max Planck Institute for Infection Biology Charitéplatz 1 D-10117 Berlin GERMANY Phone: + 49 30 28460 430 Fax: + 49 30 28460 401 E-Mail: ber...@mpiib-berlin.mpg.de Web : www.mpiib-berlin.mpg.de [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel