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.tay...@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

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to