[R] Change in how R handles assignments?

Prof Brian Ripley ripley at stats.ox.ac.uk
Mon May 17 16:44:17 CEST 2004


Note, this is how R handles `replacement subsetting of data frames'.

On Mon, 17 May 2004, David Kreil wrote:

> I have been using the following code in earlier versions of R:

What `earlier versions'?  As far as I know this was changed in 1.8.0.

>   q[,names(info)]<-info[no,];

You do not need to terminate lines in ;, BTW.

> with
> 
> > class(info)
> [1] "data.frame"
> > class(q)
> [1] "data.frame"
> > dim(q)
> [1] 7488   68
> > dim(info)
> [1] 12  8
> > dim(info[no,])
> [1] 1 8
> 
> The column names(info) did not exist in q before the assignment.
> 
> What used to happen (as intended) was that they would be created, and each of 
> the 7488 rows would be set the same value, info[no,].

But that was not what was documented.  The intention is that the rhs be a 
list, not a data frame.

> Now, in the current version of R this gives the error:
> 
> Error in "[[<-.data.frame"(`*tmp*`, k, value = rep(value[[k]], len = n)) : 
> 	replacement has 7488 rows, data has 1
> 
> I can use the following as a workaround
> 
>     for (n in names(info))
>       q[,n]<-info[no,n];
> 
> but it seems clunky. Is there a more elegant/simple way to do the same thing 
> in the current version of R? It seems I'm unintentionally forcing it to do 
> something it doesn't "like".

Here's a simple example that does the same in 1.8.0 as R-patched:

x <- data.frame(a=1:3, b=4:6, c=7:9)
info <- x[1:2]
x[, names(info)] <-  info[1, ]

You can do
x[, names(info)] <-  info[rep(1,3), ]
or
x[, names(info)] <- unclass(info[1, ])

We'll unclass a data frame rhs internally in future.

-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595




More information about the R-help mailing list