[Rd] Simultaneously adding rows and columns by '[<-.data.frame' may	fail
    Suharto Anggono Suharto Anggono 
    suharto_anggono at yahoo.com
       
    Wed Feb 20 11:42:37 CET 2013
    
    
  
I saw the following in R help page "Extract.data.frame".
     The replacement methods can be used to add whole column(s) by
     specifying non-existent column(s), in which case the column(s) are
     added at the right-hand edge of the data frame and numerical
     indices must be contiguous to existing indices.  On the other
     hand, rows can be added at any row after the current last row, and
     the columns will be in-filled with missing values.
So, I tried something like this.
> x <- data.frame(a=1, s=1)
> y <- data.frame(a=1, r=8, e=9)
> z <- x
> z[2, c("a","r","e")] <- y
Error in `*tmp*`[[j]] : recursive indexing failed at level 2
Using debug("[<-.data.frame") revealed that execution stopped at this line.
                  length(x[[j]]) <- nrows
From stepping by debug("[<-.data.frame"), I saw that '[<-.data.frame' actually did well before the failing line. In the failing line, it looks like 'jj' is meant instead of 'j'.
In the code of function '[<-.data.frame', near the end, it looks like 'j' needs to be replaced with 'jj' in the lines marked by # below.
    if (has.i) 
        for (jjj in seq_len(p)) {
            jj <- jseq[jjj]
            vjj <- value[[jvseq[[jjj]]]]
            if (jj <= nvars) {
                ...
            }
            else {
                x[[jj]] <- vjj[FALSE]
                if (length(dim(vjj)) == 2L) {
                  length(x[[j]]) <- nrows * ncol(vjj)  #
                  dim(x[[j]]) <- c(nrows, ncol(vjj))  #
                  x[[jj]][iseq, ] <- vjj
                }
                else {
                  length(x[[j]]) <- nrows  #
                  x[[jj]][iseq] <- vjj
                }
            }
        }
    else ... 
After doing fix("[<-.data.frame") by replacing appropriate 'j' with 'jj', it works.
> fix("[<-.data.frame")
> x <- data.frame(a=1, s=1)
> y <- data.frame(a=1, r=8, e=9)
> z <- x
> z[2, c("a","r","e")] <- y
> z
  a  s  r  e
1 1  1 NA NA
2 1 NA  8  9
> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_United States.1252
[2] LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
loaded via a namespace (and not attached):
[1] tools_2.15.2
    
    
More information about the R-devel
mailing list