Skip to content

What does class "call" mean? How do I make class "formula" into a "call"?

5 messages · StellathePug, David Winsemius, Peter Dalgaard

#
Hello R Users! 
I have a list called "tabs" that I would like to have the same structure as
my list "eqSystem." The two look like they have the same structure but they
are different because when I look at their attributes, class(eqSystem[[1]])
is "call" but class(tabs[[1]]) is "formula". I want to have class(tabs[[1]])
as a call too. 

So what does "call" mean? 

And how do I make an object of class "formula" be of class "call"? 
Thank you so much!!!--Rita
[1] "list"
[1] "list"
[1] "formula"> class(eqSystem)
[1] "list"
[1] "list"
[1] "call"

Rita
=====================================
"If you think education is expensive, try ignorance."--Derek Bok

--
View this message in context: http://r.789695.n4.nabble.com/What-does-class-call-mean-How-do-I-make-class-formula-into-a-call-tp3623733p3623733.html
Sent from the R help mailing list archive at Nabble.com.
#
On Jun 24, 2011, at 6:12 PM, StellathePug wrote:

            
An as yet unevaluated function invocation with first as the named  
function followed by quoted arguments is a "call":

See the help(call) page:

 > f <- round
 > A <- 10.5
 > (g <- as.call(list(f, quote(A))))
.Primitive("round")(A)
 > eval(g)
[1] 10

 > call("mean", quote( c(1,2,3)))
mean(c(1, 2, 3))
 > eval( call("mean", quote( c(1,2,3))))
[1] 2

It seems very unlikely that a formula object could be coerced into a  
valid call simply by altering its class. To convince us otherwise you  
need to provide more information than you have supplied to the  
present. The results of str() on these objects might be a first step.
#
On Jun 25, 2011, at 15:24 , David Winsemius wrote:

            
Actually, no. Any unevaluated expression in R is mode "call", unless atomic or symbol. It will also be class "call", unless expressedly overridden by an S3 class assignment. Notice that operators are really function calls.
I.e.
[1] "call"
[1] "call"

But
[1] "name"
[1] "numeric"

(This is why the R docs keep talking about "unevaluated expressions" instead of "call objects": They aren't always that.)

The "~" operator is also a function call. However, evaluating "~" returns an object which is the actual call assigned class "formula" (plus an environment attribute).
[1] "formula"
y ~ x
attr(,".Environment")
<environment: R_GlobalEnv>
[1] "call"
[1] "call"

I.e., an unevaluated formulae expression (as in quote(y~x)) is class "call", as is an unclassed formula object. So it is pretty easy to have objects of class "formula" very similar to objects of class "call".
#
On Jun 25, 2011, at 4:33 PM, peter dalgaard wrote:

            
Not the first time I have stumbled on such matters. Chamber's SfDA  
would be one obvious place to study. Do yu have any others that pop to  
mind?   The last example suggests that mode and class can each be  
"call" so that 'call' is somehow more primitive than "function" or  
"formula".

And by way of directly addressing the OP's questions, it sounds as  
though applying unclass() to the formula objects might be attempted?
--

David Winsemius, MD
West Hartford, CT
#
On Jun 26, 2011, at 00:10 , David Winsemius wrote:

            
Class and mode can also both be "function" or "numeric", but "formula" is not a mode. 

Historically, in S v3, all objects had a mode, but only some had a class, obtained by explicitly adding a "class" attribute. In S v4, the convention that all objects have a class was introduced, and in many cases an object's mode was promoted to become its class (but matrices became of class "matrix"). 

You can learn a lot by simple experimentation. E.g., it may be useful to know that call objects are isomorphic to lists and try things like 

u <- quote(1+3*4)
u[[1]]
u[[2]]
u[[3]]
u[[3]][[1]]


etc. Beware of "false friends": things that look alike but are different, e.g. the call quote(y~x) and the formula that results from evaluating it.
Or evaluating the call, or using as.formula() on it.