From hpages at fhcrc.org  Tue Jul  2 00:51:51 2013
From: hpages at fhcrc.org (=?ISO-8859-1?Q?Herv=E9_Pag=E8s?=)
Date: Mon, 01 Jul 2013 15:51:51 -0700
Subject: [Rd] relist() is broken when the skeleton is a list with empty
 list elements
In-Reply-To: <51B259C6.8090302@fhcrc.org>
References: <51B259C6.8090302@fhcrc.org>
Message-ID: <51D20807.2080802@fhcrc.org>

Hi,

On 06/07/2013 03:08 PM, Herv? Pag?s wrote:
> Hi,
>
> relist() is broken when the skeleton is a list with empty list elements:
>
>    > x <- list(1:3, integer(0), 11:14)
>
>    > relist(unlist(x), x)
>    [[1]]
>    [1] 1 2 3
>
>    [[2]]
>    [1] 11  3
>
>    [[3]]
>    [1] 11 12 13 14
>
> Hard to believe that such a bug has been around for 6 years (i.e. since
> the introduction of relist()) without ever being noticed.

This bug has actually been noticed. Just found out it was already
reported by Michael Lawrence 2 years ago:

 
https://stat.ethz.ch/pipermail/r-devel/attachments/20110811/4bbaa84f/attachment.pl

Any chance it can be fixed?

Below is the patch against current R-devel if that helps (it fixes
relist.list and relist.matrix which are both broken in the same way).

Thanks,
H.


hpages at thinkpad:~/svn/R/R-devel$ svn diff
Index: src/library/utils/R/relist.R
===================================================================
--- src/library/utils/R/relist.R	(revision 63132)
+++ src/library/utils/R/relist.R	(working copy)
@@ -119,13 +119,13 @@

  relist.list <- function(flesh, skeleton=attr(flesh, "skeleton"))
  {
-    ind <- 1L
+    offset <- 0L
      result <- skeleton
      for (i in seq_along(skeleton)) {
  	size <- length(unlist(result[[i]]))
  	result[[i]] <-
-	    relist(flesh[ind:(ind + size - 1L)], result[[i]])
-	ind <- ind + size
+	    relist(flesh[seq_len(size) + offset], result[[i]])
+	offset <- offset + size
      }
      result
  }
@@ -139,13 +139,13 @@
      n <- nrow(skeleton)
      m <- ncol(skeleton)
      result <- skeleton
-    ind <- 1L
-    for (j in 1L:m)
-	for (i in 1L:n) {
+    offset <- 0L
+    for (j in seq_len(m))
+	for (i in seq_len(n)) {
  	    size <- length(unlist(skeleton[[i, j]]))
-	    result[[i, j]] <- relist(flesh[ind:(ind + size - 1)],
+	    result[[i, j]] <- relist(flesh[seq_len(size) + offset],
  				     skeleton[[i, j]])
-	    ind <- ind + size
+	    offset <- offset + size
  	}
      result
  }


>
> Cheers,
> H.
>
>  > sessionInfo()
> R version 3.0.1 (2013-05-16)
> Platform: x86_64-unknown-linux-gnu (64-bit)
>
> locale:
>   [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
>   [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
>   [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
>   [7] LC_PAPER=C                 LC_NAME=C
>   [9] LC_ADDRESS=C               LC_TELEPHONE=C
> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
>
> attached base packages:
> [1] stats     graphics  grDevices utils     datasets  methods   base
>

-- 
Herv? Pag?s

Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024

E-mail: hpages at fhcrc.org
Phone:  (206) 667-5791
Fax:    (206) 667-1319



[Rd] relist() is broken when the skeleton is a list with empty list elements
=?ISO-8859-1?Q?Herv=E9_Pag=E8s?=