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

Thomas Lumley tlumley at u.washington.edu
Tue Jan 16 20:26:27 CET 2007

On Tue, 16 Jan 2007, Charles Dupont wrote:

> I would assume that 'length(a <- 1:5) <- 4' should work because
> 'length(a <- 1:5)' does work.

Appearances can be deceptive.

length(a <- 1:5) evaluates a <- 1:5 and then passes its value to length(), 
in ordinary call-by-value semantics.

That can't be how complex assignment functions work, though.



and suppose names(a) is c("A","B").  This code doesn't just evaluate 
names(a) and pass the result on, since
would be silly (and invalid).  It must be doing something more 
complicated to make sure that "a", buried deep inside the call, gets 

What actually happens is that
   f(x) <- y
is rewritten in terms of the assignment function "f<-" as
   x <- "f<-"(x, y)
   names(a) <- "length<-"(names(a), 5)
which in turn is
   a <- "names<-"(a, "length<-"(names(a), 5))

This requires the assignment function "f<-" to exist, of course.

In your case
   length(a <- 1:5) <- 4
is rewritten as
   (a<-1:5) <- "length<-"(a<-1:5, 5)
and then as
   a <- "<-<-"(a, "length<-"(a<-1:5, 5))
which gives the error you report -- there is no function "<-<-".

You  might think the last stage of rewriting could just be avoided, but
   (a<-1:5) <- "length<-"(a<-1:5, 5)
is invalid if not rewritten, since it tries to modify 1:5, which is not a 

If you want to compute
    a <- 1:5
then just do it like that.


More information about the R-devel mailing list