From sfalcon at fhcrc.org  Tue Apr 10 16:47:41 2007
From: sfalcon at fhcrc.org (Seth Falcon)
Date: Tue, 10 Apr 2007 07:47:41 -0700
Subject: [Rd] list/matrix chimera
Message-ID: <m2lkh0xp4i.fsf@fhcrc.org>

Hi all,

If dimensions are added to a list, it will become a matrix-like hybrid
that calls itself a matrix, but returns lists for subset operations.

This was brought to my attention by a user that encountered such an
object and was quite confused by its behavior.  Although I have not
found the code that created the object yet, I believe that code is
simply incorrect.  Nevertheless, I wonder if R_data_class in attrib.c
should be a bit more discriminating and only return matrix or array
for atomic vectors.  Perhaps something like this:

--- a/src/main/attrib.c
+++ b/src/main/attrib.c
@@ -536,7 +536,7 @@ SEXP R_data_class(SEXP obj, Rboolean singleString)
     if(n == 0) {
        SEXP dim = getAttrib(obj, R_DimSymbol);
        int nd = length(dim);
-       if(nd > 0) {
+       if(nd > 0 && isVectorAtomic(obj)) {
            if(nd == 2)
                klass = mkChar("matrix");
            else

Here is an example that illustrates:

    vv <- as.list(1:24)
    dim(vv) <- c(6, 4)
    vv
         [,1] [,2] [,3] [,4]
    [1,] 1    7    13   19  
    [2,] 2    8    14   20  
    [3,] 3    9    15   21  
    [4,] 4    10   16   22  
    [5,] 5    11   17   23  
    [6,] 6    12   18   24  
    
    class(vv)
    [1] "matrix"
    
    typeof(vv)
    [1] "list"
    
    vv[1, 1]
    [[1]]
    [1] 1
    
    vv[1, ]
    [[1]]
    [1] 1
    
    [[2]]
    [1] 7
    
    [[3]]
    [1] 13
    
    [[4]]
    [1] 19


+ seth

-- 
Seth Falcon | Computational Biology | Fred Hutchinson Cancer Research Center
http://bioconductor.org



[Rd] list/matrix chimera
Seth Falcon