Re: [Rd] as.data.frame.matrix() returns an invalid object

2012-10-13 Thread peter dalgaard

On Oct 11, 2012, at 16:02 , Bert Gunter wrote:

 ... and further
 
 identical(as.list(df2),as.list(df1))
 [1] TRUE
 
 in R 2.15.0
 
 Not sure whether these sorts of degenerate cases are of much value,
 though. But I'll leave that for the wizards.

Looks like this is easier to fix that to argue pro/con fixing it...

AFAICS, there's a gap in the logic in as.data.frame.matrix:

if (length(row.names) != nrows) 
row.names - .set_row_names(nrows)

but length(NULL) is 0 so we can end up leaving row.names at NULL and eventually 
nulling it in the result. An explicit check for is.null(row.names) should help.

-pd
 
 -- Bert
 
 On Wed, Oct 10, 2012 at 11:22 PM, Hervé Pagès hpa...@fhcrc.org wrote:
 Hi,
 
 Two ways to create what should normally be the same data frame:
 
 df1 - data.frame(a=character(0), b=character(0)) df1
  [1] a b
  0 rows (or 0-length row.names)
 
 df2 - as.data.frame(matrix(character(0), ncol=2, dimnames=list(NULL,
 letters[1:2])))
 df2
  [1] a b
  0 rows (or 0-length row.names)
 
 unique() works as expected except that I get a warning on 'df2':
 
 unique(df1)
  [1] a b
  0 rows (or 0-length row.names)
 
 unique(df2)
  [1] a b
  0 rows (or 0-length row.names)
  Warning message:
  In is.na(rows) : is.na() applied to non-(list or vector) of type 'NULL'
 
 Look like the two data frames are not identical:
 
 identical(df1, df2)
  [1] FALSE
 
 all.equal(df1, df2)
  [1] Attributes:  Length mismatch: comparison on first 1 components 
 
 attributes(df1)
  $names
  [1] a b
 
  $row.names
  integer(0)
 
  $class
  [1] data.frame
 
 attributes(df2)
  $names
  [1] a b
 
  $class
  [1] data.frame
 
 Actually 'df2' is considered broken by validObject():
 
 validObject(df1)
  [1] TRUE
 
 validObject(df2)
  Error in validObject(df2) :
invalid class “data.frame” object: slots in class definition but not in
 object: row.names
 
 This is with R 2.15 and recent R devel.
 
 Cheers,
 H.
 
 --
 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: hpa...@fhcrc.org
 Phone:  (206) 667-5791
 Fax:(206) 667-1319
 
 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel
 
 
 
 -- 
 
 Bert Gunter
 Genentech Nonclinical Biostatistics
 
 Internal Contact Info:
 Phone: 467-7374
 Website:
 http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm
 
 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel

-- 
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd@cbs.dk  Priv: pda...@gmail.com

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] as.data.frame.matrix() returns an invalid object

2012-10-12 Thread Bert Gunter
... and further

 identical(as.list(df2),as.list(df1))
[1] TRUE

in R 2.15.0

Not sure whether these sorts of degenerate cases are of much value,
though. But I'll leave that for the wizards.

-- Bert

On Wed, Oct 10, 2012 at 11:22 PM, Hervé Pagès hpa...@fhcrc.org wrote:
 Hi,

 Two ways to create what should normally be the same data frame:

df1 - data.frame(a=character(0), b=character(0)) df1
   [1] a b
   0 rows (or 0-length row.names)

df2 - as.data.frame(matrix(character(0), ncol=2, dimnames=list(NULL,
 letters[1:2])))
df2
   [1] a b
   0 rows (or 0-length row.names)

 unique() works as expected except that I get a warning on 'df2':

unique(df1)
   [1] a b
   0 rows (or 0-length row.names)

unique(df2)
   [1] a b
   0 rows (or 0-length row.names)
   Warning message:
   In is.na(rows) : is.na() applied to non-(list or vector) of type 'NULL'

 Look like the two data frames are not identical:

identical(df1, df2)
   [1] FALSE

all.equal(df1, df2)
   [1] Attributes:  Length mismatch: comparison on first 1 components 

attributes(df1)
   $names
   [1] a b

   $row.names
   integer(0)

   $class
   [1] data.frame

attributes(df2)
   $names
   [1] a b

   $class
   [1] data.frame

 Actually 'df2' is considered broken by validObject():

validObject(df1)
   [1] TRUE

validObject(df2)
   Error in validObject(df2) :
 invalid class “data.frame” object: slots in class definition but not in
 object: row.names

 This is with R 2.15 and recent R devel.

 Cheers,
 H.

 --
 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: hpa...@fhcrc.org
 Phone:  (206) 667-5791
 Fax:(206) 667-1319

 __
 R-devel@r-project.org mailing list
 https://stat.ethz.ch/mailman/listinfo/r-devel



-- 

Bert Gunter
Genentech Nonclinical Biostatistics

Internal Contact Info:
Phone: 467-7374
Website:
http://pharmadevelopment.roche.com/index/pdb/pdb-functional-groups/pdb-biostatistics/pdb-ncb-home.htm

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel