2016-06-01 15 views
1

Die R-lang heißt es: „Es gibt drei Arten von Objekten, die die R Sprache darstellen Sie sind Anrufe, Ausdrücke, ....“typeof Anruf vs typeof Ausdruck

Dies sind ein Ausdruck und ein Aufruf:

ex <- expression(max(1:3)) 
cl <- call("max", x = 1:3) 

Sie sind beide Sprachobjekte:

is.language(ex) 
# [1] TRUE 
is.language(cl) 
# [1] TRUE 

Ausdrücke sind vom Typ Ausdruck

typeof(ex) 
# [1] "expression" 

Ich habe Anrufe von zu erwarten Typ ist Anruf aber sie sind von der allgemeineren Art Sprache

typeof(cl) 
# [1] "language" 

jemand, wenn es eine rationale dahinter Weiß? Fehle ich etwas Wichtiges?

Vielen Dank im Voraus für jede Unterstützung

Antwort

2

typeof gibt Informationen über den Speichermechanismus. Deshalb gibt typeof(factor(letters))integer zurück.

Es ist im Allgemeinen informativer, ein Objekt mit der class Funktion abzufragen, anstatt typeof zu verwenden.

> class(cl) 
[1] "call" 

Die ?typeof Hilfeseite verweist auch auf ?storage.mode, die weitere Details hat, obwohl typeof die mehr „fundamental“ Funktion in dem Sinne, dass storage.modetypeof mit definiert:

> storage.mode(cl) 
[1] "language" 

Der Unterschied zwischen R-Ausdrücken und Anrufen hat mich gelegentlich gestolpert. Die bquote-Funktion gibt ein call -Objekt und nicht einen "wahren" R-Ausdruck zurück. Zu einer Zeit, die dazu führte, dass Gitterplotting-Funktionen es ablehnten, eine Plotmath-Auswertung auf Ergebnisse von bquote durchzuführen, obwohl ich denke, dass Glitch behoben worden ist. Sie sollten sich auch mit der Funktionsweise von substitute und den Unterschieden bei der Analyse der Argumente vertraut machen:

substitute(expression(max(1:3)), list(max=min)) 
#expression(.Primitive("min")(1:3)) # Success 

substitute(call('max', x=1:3), list(max=min)) 
#call("max", x = 1:3) #Failure