[R] 'class(.) == **' [was 'Call to a function']

Steven Yen syen04 at gmail.com
Fri Jun 26 04:48:20 CEST 2015


Thanks to all for the help. I have learned much about "inherit" and 
"class". I like to know about one additional option, and that is to use 
a calling parameter without the quotation marks, similar to the linear 
regression syntax:

lm(data=mydata,weights=wt)

Below is a simple set of codes to calculate weighted means with 
generated data in data frame "mydata". As annotated below, I like the 
following call to work (without the quotations):

wmean(mydata,wt=weight)

Thank you!
----

mydata<-matrix(1:20,ncol=2)
mydata<-cbind(mydata,runif(10,0,1))
colnames(mydata)<-c("y","x","weight")
mydata<-as.data.frame(mydata)

wmean <- function(data,wt){
   if (inherits(wt,what="character")) wt<-data[,wt]
   wt<-wt/mean(wt)
   Mean<-NULL
   for (i in 1:ncol(data)){
     Mean[i] <- sum(data[,i]*wt)/sum(wt)
   }
   list("Mean: ",Mean)
}
wmean(mydata,wt="weight") # This works
wmean(mydata,wt=weight)   # <= Like this to work
reg<-lm(data=mydata,weights=weight) # ? lm

On 6/24/2015 3:20 AM, Martin Maechler wrote:
>>>>>> Steve Taylor <steve.taylor at aut.ac.nz>
>>>>>>      on Wed, 24 Jun 2015 00:56:26 +0000 writes:
>
>      > Note that objects can have more than one class, in which case your == and %in% might not work as expected.
>
>      > Better to use inherits().
>
>      > cheers,
>      > Steve
>
> Yes indeed, as Steve said, really do!
>
> The use of   (class(.) == "....")   it is error prone and
> against the philosophy of classes (S3 or S4 or ..) in R :
>
> Classes can "extend" other classes or "inherit" from them;
> S3 examples in "base R"  are
>   - glm() objects which are "glm"
>     but also inherit from "lm"
>   - multivariate time-series are "mts" and "ts"
>   - The time-date objects  POSIXt , POSIXct, POSIXlt
>
> ==> do work  with  inherits(<obj>, <class))
> or  possibly       is( <obj>, <class>)
>
>
> We've seen this use of	
>
>       class(.) == ".."    (or '!=" or  %in% ...)
>
> in too many places;  though it may work fine in your test cases,
> it is wrong to be used in generality e.g. inside a function you
> provide for more general use,
> and is best  replaced with the use of inherits() / is()
> everywhere  "out of principle".
>
> Martin Maechler
> ETH Zurich
>

-- 
Steven Yen
My e-mail alert:
https://youtu.be/9UwEAruhyhY?list=PLpwR3gb9OGHP1BzgVuO9iIDdogVOijCtO



More information about the R-help mailing list