[Rd] Why does not the command 'length(a <- 1:5) <- 4' not work?

Duncan Murdoch murdoch at stats.uwo.ca
Tue Jan 16 20:12:39 CET 2007


On 1/16/2007 1:24 PM, Charles Dupont wrote:
> when running the command
>   > length(a <- 1:5) <- 4
> 
> there are two responses.
> 
> If 'a' does not exist then the response is
> 
> Error in length(a <- 1:5) <- 4 : object "a" not found
> 
> If 'a' does exist then the response is
> 
> Error in length(a <- 1:5) <- 4 : could not find function "<-<-"
> 
> I would assume that 'length(a <- 1:5) <- 4' should work because 
> 'length(a <- 1:5)' does work.

I'm guessing you are assuming it would mean the same as

a <- 1:5
length(a) <- 4

But how would R know the name of the variable whose length is set in the 
second line?  In "a <- 1:5" the "a" is just part of a larger expression, 
it's not special as in some other languages, i.e. R sees that as

"<-"(a, 1:5)

So if you rewrote your original as

length("<-"(a, 1:5)) <- 4

it is a lot less clear that you really mean to create and then change "a".

In general things like

foo(a) <- b

are evaluated as "foo<-"(a, b), where "foo<-" is a function that expects 
a variable reference as its first argument.  There's some magic going on 
to allow things like

a <- matrix(1:4, 2,2)
names(dim(a)) <- letters[1:2]

and I think the parser is trying to set things up for that kind of magic 
in your expression, though I haven't traced through the execution path 
to explain exactly why you saw the error messages you saw.

Duncan Murdoch



More information about the R-devel mailing list