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.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. David Winsemius Alameda, CA, USA ______________________________________________ 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.