2015-06-25 4 views
5

Angenommen, ich habe zwei benutzerdefinierte Infix-Operatoren in R: %foo% und %bar%.In R, wie kann ich die Operatorpriorität von benutzerdefinierten Infixoperatoren bestimmen?

ich Ausdrücke, die beiden Operatoren verwenden, wie zum Beispiel:

x %foo% y %bar% z 

Wie kann ich den Operator Vorrang von %foo% und %bar% bestimmen?

Wie kann ich die Priorität so ändern, dass z. B. %bar% immer vor %foo% ausgeführt wird? In dem obigen Beispiel wäre dies das gleiche wie:

x %foo% (y %bar% z) 

Antwort

5

Ich glaube nicht, dies explizit dokumentiert ist, aber implizit in den R language documentation ist, dass Infixoperatoren alle gleich Vorrang sind und so ist von links nach rechts ausgeführt . Dies kann wie folgt nachgewiesen werden:

`%foo%` <- `+` 
`%bar%` <- `*` 
1 %bar% 2 %foo% 3 
#5 
1 %foo% 2 %bar% 3 
#9 

Die einzige Option, die ich von wäre denken kann, eine der bestehenden Betreiber neu zu definieren, zu tun, was man wollte. Dies würde jedoch Auswirkungen haben, so dass Sie es möglicherweise auf eine Funktion beschränken möchten.

Es ist auch erwähnenswert, dass substitute mit den Bediener nicht Vorrang ändern bereits gesetzt, wenn der Ausdruck wird zuerst geschrieben:

eval(substitute(2 + 2 * 3, list(`+` = `*`, `*` = `+`))) 
#10 
2 * 2 + 3 
#7 
2

Wie kann ich den Operator Vorrang% foo% und% bar% bestimmen ?

Sie können nicht. Mit R können Sie nicht den Vorrang von benutzerdefinierten Infix-Operatoren festlegen. Benutzerdefinierte Infix-Operatoren haben die Standard-Vorrangregeln, was bedeutet, dass sie von links nach rechts ausgewertet werden.

Ein Grund für diese Einschränkung ist, dass es extrem schwierig und einschränkend wäre, eine Reihe von Präzedenzregeln für Infix-Operatoren zu implementieren und aufrechtzuerhalten. Stellen Sie sich vor, Sie hätten ein R-Paket geladen, das einige benutzerdefinierte Infix-Operatoren enthält. Dann müsste die Beziehung der Infix-Operatoren aus dem Paket zu den %foo% und %bar%, die Sie erstellt haben, definiert werden. Dies wird schnell zu einer ernsthaften Belastung werden.

Stellen Sie sich als Beispiel vor, dass Paket 1 den Infix-Operator %P1IF% enthält und Paket 2 den Infix-Operator %P2IF% enthält. Jedes Paket hat definiert, dass sein Infix-Operator die höchste Priorität haben sollte. Wenn Sie beiden Pakete laden sind und zwei, dann würde der folgende Ausdruck undefiniert:

v1 %P1IF% v2 %P2IF% v3 
(v1 %P1IF% v2) %P2IF% v3  # package 2 doesn't expect this 
v1 %P1IF% (v2 %P2IF% v3)  # package 1 doesn't expect this 

Unabhängig davon, was die Priorität könnte das Ergebnis für eines der beiden Pakete sein könnte falsch sein.

Verwandte Themen