From p.dalgaard@biostat.ku.dk  Thu Aug  5 14:57:27 1999
From: p.dalgaard@biostat.ku.dk (Peter Dalgaard BSA)
Date: 05 Aug 1999 15:57:27 +0200
Subject: cbind is not generic as claimed, omits labels where S has them (PR#239)
In-Reply-To: ripley@stats.ox.ac.uk's message of "Thu, 5 Aug 1999 13:28:05 +0200 (MET DST)"
References: <199908051128.NAA28801@pubhealth.ku.dk>
Message-ID: <x2lnbqgwjc.fsf@blueberry.kubism.ku.dk>

ripley@stats.ox.ac.uk writes:

> (1) ?cbind claims
> 
>      The generic functions `cbind' and `rbind' take a
>      sequence of vector and/or matrix arguments and combine
>      them as the columns or rows, respectively, of a matrix.
> 
> Note:
> 
>      The method dispatching is not done via `UseMethod(..)',
>      but by C-internal dispatching.  Therefore, there's no
>      need for, e.g., `rbind.default'.
> 
> but my cbind.ts does not get called, and try the following:
> 
> cbind.my <- function(...)
> {
>     stop("used cbind.my")
> }
> a <- b <- 1:3
> cbind(a, b)
> class(a) <- "my"
> cbind(a, b)
>      [,1] [,2]
> [1,]    1    1
> [2,]    2    2
> [3,]    3    3
> 
> This is incorrect.
> 
> (2) S would give 
>      a b 
> [1,] 1 1
> [2,] 2 2
> [3,] 3 3
> (and stop on the second cbind call).
> 
> and this discrepancy is hardly an improvement!
> 
> Could someone who can understands the c/rbind code please sort this out.
> (It looks pretty arcane to me, and surely should not be special-casing data
> frames.)

Hmm. 

(1) The docs are clearly wrong (or perhaps rather, wishful thinking)

(2) Cbind should be generic as in Splus

(3) For the labels, one needs essentially to implement deparse.level
    or face the horrors of
    eval(substitute(cbind(a,b,deparse.level=2),list(a=rnorm(10),b=rnorm(10))))

(4) The dataframe special casing seems to be an evasion. The sticky
    bit is that one needs to dispatch on *any* argument. For Splus (3.4)
    compatibility, one has to check each argument for its class
    method, and if all arguments agree - in the sense that all the
    arguments that have class methods must have the same one, dispatch
    to that method. If they disagree, print error message and try
    default method. 

    Whoever wrote the code seems to have decided that things would be
    easier if one assumed that the only method for cbind was
    cbind.data.frame...

    Note that by the above logic, if you make a cbind.ts, you can't
    cbind a time series to a data frame!
 
-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


cbind is not generic as claimed, omits labels where S has them (PR#239)
Peter Dalgaard BSA