[R] real and complex vectors

Duncan Murdoch murdoch at stats.uwo.ca
Wed Feb 16 11:47:29 CET 2005


On Wed, 16 Feb 2005 10:00:01 +0000, Robin Hankin
<r.hankin at soc.soton.ac.uk> wrote :

>The following caught me off-guard:
>
>
>R> z <- 1i + 1:10
>R> z <- Re(z)
>R> z
>  [1]  1  2  3  4  5  6  7  8  9 10
>
>as expected.  But look:
>
>R> z <- 1i + 1:10
>R> make.real <- abs(z) < 1000
>R> z[make.real] <- Re(z[make.real])
>R> z
>  [1]  1+0i  2+0i  3+0i  4+0i  5+0i  6+0i  7+0i  8+0i  9+0i 10+0i
>R>
>
>didn't make z a real vector, which is what I wanted.  ?"[<-" says
>
>      If one of these expressions appears on the left side of an
>      assignment then that part of 'x' is set to the value of the right
>      hand side of the assignment.
>
>so the behaviour is as documented: class(z) is unchanged in the second 
>session.
>
>Would modifying "[<-" to add a test for all elements of an object being 
>replaced (and
>if this is the case  to change the class of z appropriately),  be a bad 
>idea?

I think it might be.  Think of a situation where make.real is almost
never all true.  Then z would almost always remain complex after

 z[make.real] <- Re(z[make.real])

but on rare occasions would switch to being real.  If some poor
programmer assumed that z was always complex, it would likely pass
tests, but on rare occasions would give garbage.  (Off the top of my
head I can't think of any cases where R code that expects a complex
vector would fail if passed a real one, but it's certainly easy to
construct cases in external code.)

I think it's safer to make the conversion explicitly if you happen to
know that all(make.real) is true.

Duncan Murdoch




More information about the R-help mailing list