[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.
Consider
length(names(a))<-5
and suppose names(a) is c("A","B"). This code doesn't just evaluate
names(a) and pass the result on, since
length(c("A","B"))<-5
would be silly (and invalid). It must be doing something more
complicated to make sure that "a", buried deep inside the call, gets
updated.
What actually happens is that
f(x) <- y
is rewritten in terms of the assignment function "f<-" as
x <- "f<-"(x, y)
so
length(names(a))<-5
is
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
variable.
If you want to compute
a <- 1:5
length(a)<-4
then just do it like that.
-thomas
More information about the R-devel
mailing list