Suharto Anggono Suharto Anggono
2013-Feb-20 10:42 UTC
[Rd] Simultaneously adding rows and columns by '[<-.data.frame' may fail
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")] <- yError 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 > za 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