[Rd] c(NA, 0+1i) not the same as c(as.complex(NA), 0+1i)?
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Mon Nov 6 12:08:22 CET 2023
>>>>> Michael Chirico
>>>>> on Sun, 5 Nov 2023 09:41:42 -0800 writes:
> This is another follow-up to the thread from September
> "Recent changes to as.complex(NA_real_)".
> A test in data.table was broken by the changes for NA
> coercion to complex; the breakage essentially comes from
> c(NA, 0+1i)
> # vs
> c(as.complex(NA), 0+1i)
> The former is the output we tested against; the latter is essentially (via
> coerceVector() in C) what's generated by our data.table::shift()
> However, these are now (r85472) different:
> Im(c(NA, 0+1i))
> # [1] NA 1
> Im(c(as.complex(NA), 0+1i))
> # [1] 0 1
> The former matches the behavior of directly using NA_complex_:
> Im(c(NA_complex_, 0+1i))
> # [1] NA 1
> On R4.3.2, they both match the NA_complex_ behavior:
> Im(c(NA, 0+1i))
> # [1] NA 1
> Im(c(as.complex(NA), 0+1i))
> # [1] NA 1
> Is this intended behavior, does something need to be updated for c() as
> well?
> Certainly it's messing with my understanding of how c() behaves, e.g. in ?c
>> All arguments are coerced to a common type which is the type of the
> returned value
I think you have confused yourself, and everything behaves as expected:
As we now have (in R-devel, since {r85233 | maechler | 2023-09-29 })
• ‘as.complex(x)’ now returns ‘complex(real=x, imaginary=0)’
for _all_ numerical and logical ‘x’, notably also for ‘NA’
or ‘NA_integer_’.
==> as.complex(NA) is indeed complex(real = NA, imaginary = 0)
And now, in your
c(as.complex(NA), 0+1i)
you are calling c() on two complex numbers, i.e., there is *no* coercion
(and c(.) is rather "trivial"), and the same is true for
c(NA_complex_, 0+1i)
However, in 85233, I had only modified & added examples to ?as.complex,
and now have added more (corresponding to the above NEWS entry);
-> svn rev 85475
.............
The underlying "dilemma" that nobody can help us with is that
"almost infinitely" many different complex numbers z fulfill
is.na(z) |--> TRUE
and only one of them is NA_complex_ and that may be unintuitive.
OTOH, we already have for the doubles that there are at least two
different x fulfulling is.na(x), namely NaN and NA
and from C's point of view there are even considerably more
different NaN's .. but now I'm definitely digressing.
Martin
More information about the R-devel
mailing list