[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