astokes at esica.com
2009-May-29 00:35 UTC
[Rd] edge case concerning NA in dim() (PR#13729)
Full_Name: Allan Stokes Version: 28.1 OS: XP Submission from: (NULL) (24.108.0.245) I'm trying to use package HDF5 and have discovered some round-trip errors: save, load, save is not idempotent. I started digging into the type system to figure out what type graffiti is fouling this up. Soon I discovered that comparisons with NULL produce zero length vectors, which I hadn't known was possible, and I started to wonder about the properties of zero length objects. L0 <- logical (0) dim(L0) <- c(0) # OK dim(L0) <- c(1) # error dim(L0) <- c(0,1) # OK dim(L0) <- c(0,-1) # OK dim(L0) <- c(0,3.14) # OK, c(0,3) results dim(L0) <- c(0,FALSE) # OK c(0,0) results dim(L0) <- c(0,NA) # OK dim(L0) <- c(1,NA) # error dim(L0) <- c(1,NA,NA) # OK, SURPRISE!! NA*NA is normally NA, but in the test for dim() assignment, it appears that NA*NA == 0, which is then allowed. If the list contains more than one NA elements, the product seems to evaluate to zero. I can see making a case for 0*NA == 0 in this context, but not for NA*NA == 0. As an aside, I'm not sure why 0*NA does not equal 0 in general evaluation, unless NA is considered to possibly represent +/-inf.
On Fri, 29 May 2009, astokes at esica.com wrote:> Full_Name: Allan Stokes > Version: 28.1 > OS: XP > Submission from: (NULL) (24.108.0.245) > > > I'm trying to use package HDF5 and have discovered some round-trip errors: save, > load, save is not idempotent. I started digging into the type system to figure > out what type graffiti is fouling this up. > > Soon I discovered that comparisons with NULL produce zero length vectors, which > I hadn't known was possible, and I started to wonder about the properties of > zero length objects. > > L0 <- logical (0) > dim(L0) <- c(0) # OK > dim(L0) <- c(1) # error > dim(L0) <- c(0,1) # OK > dim(L0) <- c(0,-1) # OK > dim(L0) <- c(0,3.14) # OK, c(0,3) results > dim(L0) <- c(0,FALSE) # OK c(0,0) results > dim(L0) <- c(0,NA) # OK > dim(L0) <- c(1,NA) # error > dim(L0) <- c(1,NA,NA) # OK, SURPRISE!! > > NA*NA is normally NA, but in the test for dim() assignment, it appears that > NA*NA == 0, which is then allowed. If the list contains more than one NA > elements, the product seems to evaluate to zero.The calculation was done in C and failed to take NAs (and indeed negative values) into account. So> L <- logical(1) > dim(L) <- c(1, -1, -1)succeeded. Thank you for the report, changed in R 2.9.0 patched. (Since the representation of an integer NA is negative, a test for positivity would have caught this.)> I can see making a case for 0*NA == 0 in this context, but not for NA*NA == 0. > As an aside, I'm not sure why 0*NA does not equal 0 in general evaluation, > unless NA is considered to possibly represent +/-inf.In fact NA as used here is logical but is coerced to a numeric NA, and a 'missing' numeric could take any possible value including Inf, -Inf and NaN. -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595
Apparently Analagous Threads
- install.packages hangs RGui with frozen rpwd process at bottom of process tree (PR#13734)
- install.packages hangs RGui with frozen rpwd process at (PR#13739)
- ZFS Dataset lost structure
- Variable as color in a barplot
- How to plot multiple graphs each with multiple y variables