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

David Winsemius dwinsemius at comcast.net
Fri Jun 26 08:39:18 CEST 2015


On Jun 25, 2015, at 7:48 PM, Steven Yen wrote:

> 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)

Let's start with the call. If you are to execute this,  then names `mydata` and `weight` each must have a value.

> 
> Thank you!
> ----
> 
> mydata<-matrix(1:20,ncol=2)

OK. There is a value having been assigned to `mydata`

> mydata<-cbind(mydata,runif(10,0,1))

And now augmented.

> colnames(mydata)<-c("y","x","weight")

And a names attribute added for its columns.

> mydata<-as.data.frame(mydata)
> 
> wmean <- function(data,wt){
>  if (inherits(wt,what="character")) wt<-data[,wt]
>  wt<-wt/mean(wt)

Here's the problem. If `wt` was of mode "character", then you cannot divide it by a number, since the RHS will be evaluated first. You really should read the error messages!

Perhaps you meant:

wt <-  data[, wt]/mean(data[ , wt]

But if you did, then it's rather confusing (but possible) to assign the value to the same name as the column of the matrix.


>  Mean<-NULL

Why do that? If you remove it from the workspace then you cannot assign a value using indexed assignment as you apparently intend to do. Should have been

Mean <- numeric( ncol(data) )


>  for (i in 1:ncol(data)){
>    Mean[i] <- sum(data[,i]*wt)/sum(wt)

There is a bit of a confusion here. `wt` started out as a character value. I guess you could do this.

>  }
>  list("Mean: ",Mean)

Wrong syntax for lists. Suspect you want 	

   list(Mean=Mean)


> }
> wmean(mydata,wt="weight") # This works
> wmean(mydata,wt=weight)   # <= Like this to work

So were you planning to execute this first?

weight="weight" #?

-- 
David.


> 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
> 
> ______________________________________________
> R-help at 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.

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list