Re: [Rd] Make as.factor an S3 generic?

From: Martin Morgan <mtmorgan_at_fhcrc.org>
Date: Wed, 20 Apr 2011 11:40:31 -0700

On 04/20/2011 11:38 AM, Prof Brian Ripley wrote:
> Well, lots of functions are not generic. We do ask you to give a case
> for such changes ... where is it?

The specific need started with base::lapply, which calls base::as.list. An S4 method "as.list,A-method" defined in a name space isn't seen by base::as.list, whereas as.list.A is (see discussion in ?Methods around /f3.myClass). The question is from this post on a Bioconductor mailing list

https://stat.ethz.ch/pipermail/bioc-sig-sequencing/2011-April/001979.html

[partly answering Bill's question here] A list() constructor could be tricky to implement (dealing with variable numbers of arguments and the S4 rules for dispatch on ...), whereas as.list.A is trivial (slot extraction, in my case). Having arrived at an easy solution, I marched through the other coercion functions with only minor set-backs (as.double.A instead of as.numeric.A) until factor.

Martin

>
> On Wed, 20 Apr 2011, Martin Morgan wrote:
>
>> as.factor / as.ordered is not written as a generic. This differs from
>> as.numeric, as.matrix, and other as.*. The following seems to address
>> this and does not break make check-all.
>>
>> FWIW, the patch is against r55563, because with r55564 I see
>
> OS-specific ....
>
>> /home/mtmorgan/src/R-devel/src/main/dounzip.c:75:15: error: storage
>> size of ‘dt’ isn’t known
>> /home/mtmorgan/src/R-devel/src/main/dounzip.c:88:5: warning: implicit
>> declaration of function ‘mktime’
>> make[3]: *** [dounzip.o] Error 1
>> make[3]: *** Waiting for unfinished jobs....
>> make[3]: Leaving directory `/home/mtmorgan/bin/R-devel/src/main'
>> make[2]: *** [R] Error 2
>> make[2]: Leaving directory `/home/mtmorgan/bin/R-devel/src/main'
>> make[1]: *** [R] Error 1
>> make[1]: Leaving directory `/home/mtmorgan/bin/R-devel/src'
>> make: *** [R] Error 1
>>
>>
>> Index: src/library/base/R/factor.R
>> ===================================================================
>> --- src/library/base/R/factor.R (revision 55563)
>> +++ src/library/base/R/factor.R (working copy)
>> @@ -45,7 +45,9 @@
>> }
>>
>> is.factor <- function(x) inherits(x, "factor")
>> -as.factor <- function(x) if (is.factor(x)) x else factor(x)
>> +as.factor.default <- function(x, ...)
>> + if (is.factor(x)) x else factor(x, ...)
>> +as.factor <- function(x, ...) UseMethod("as.factor")
>>
>> ## Help old S users:
>> category <- function(...) .Defunct()
>> @@ -245,7 +247,10 @@
>> ordered <- function(x, ...) factor(x, ..., ordered=TRUE)
>>
>> is.ordered <- function(x) inherits(x, "ordered")
>> -as.ordered <- function(x) if(is.ordered(x)) x else ordered(x)
>> +as.ordered.default <- function(x, ...)
>> + if(is.ordered(x)) x else ordered(x, ...)
>> +as.ordered <- function(x, ...)
>> + UseMethod("as.ordered")
>>
>> Ops.ordered <- function (e1, e2)
>> {
>> Index: src/library/base/man/factor.Rd
>> ===================================================================
>> --- src/library/base/man/factor.Rd (revision 55563)
>> +++ src/library/base/man/factor.Rd (working copy)
>> @@ -10,7 +10,9 @@
>> \alias{is.factor}
>> \alias{is.ordered}
>> \alias{as.factor}
>> +\alias{as.factor.default}
>> \alias{as.ordered}
>> +\alias{as.ordered.default}
>> \alias{is.na<-.factor}
>> \alias{Math.factor}
>> \alias{Ops.factor}
>> @@ -40,8 +42,8 @@
>> is.factor(x)
>> is.ordered(x)
>>
>> -as.factor(x)
>> -as.ordered(x)
>> +as.factor(x, \dots)
>> +as.ordered(x, \dots)
>>
>> addNA(x, ifany=FALSE)
>> }
>>
>> --
>> Computational Biology
>> Fred Hutchinson Cancer Research Center
>> 1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109
>>
>> Location: M1-B861
>> Telephone: 206 667-2793
>>
>> ______________________________________________
>> R-devel_at_r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>

-- 
Computational Biology
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N. PO Box 19024 Seattle, WA 98109

Location: M1-B861
Telephone: 206 667-2793

______________________________________________
R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
Received on Wed 20 Apr 2011 - 18:46:55 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Wed 20 Apr 2011 - 20:30:50 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.

list of date sections of archive