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

David Winsemius dwinsemius at comcast.net
Fri Jun 26 16:31:26 CEST 2015


On Jun 25, 2015, at 11:52 PM, Steven Yen wrote:

> Thanks Davis. But actually, the line is legitimate:

I didn't say it was illegitimate, only confusing.

> 
>   if (inherits(wt,what="character")) wt<-data[,wt]

What you are asking for is known in R as non-standard evaluation. Examples include the library and help functions. About a page and a half down the code for `help`, you see this line, following a tryCatch test to see if the argument is character:

  stopic <- deparse(substitute(topic))

That returns a character value from a symbol. About three pages inside the code for `library` you also see this after a test for 'character'-ness:

  package <- as.character(substitute(package))

-- 
David.


> 
> because, coming down with wt being characters, the part wt<-data[,wt] then picks up variables data$wt. The call
> 
>   wmean(mydata,wt="weight")
> 
> actually goes OK. I was hoping to figure out a way to fix the wmean routine some how so that I can call with
> 
>   wmean(mydata,wt=weight)
> 
> Good to know there is a better way to initialize the vector Mean and and a better list command. Thank you!
> 
> On 6/26/2015 2:39 AM, David Winsemius wrote:
>> 
>> 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" #?
>> 
> 
> -- 
> Steven Yen
> My e-mail alert:
> https://youtu.be/9UwEAruhyhY?list=PLpwR3gb9OGHP1BzgVuO9iIDdogVOijCtO

David Winsemius
Alameda, CA, USA



More information about the R-help mailing list