/ / Wie kann ich in R den Operator-Vorrang von benutzerdefinierten Infix-Operatoren ermitteln? - r, Operatoren, Operatorpriorität, Infix-Notation

Wie kann ich in R die Rangfolge der Operatoren von benutzerdefinierten Infix-Operatoren bestimmen? - r, Operatoren, Operator-Vorrang, Infix-Notation

Angenommen, ich habe zwei benutzerdefinierte Infix-Operatoren in R: %foo% und %bar%.

Ich habe Ausdrücke, die beide Operatoren verwenden, z.

x %foo% y %bar% z

Wie kann ich die Operatorpriorität von ermitteln? %foo% und %bar%?

Wie kann ich die Rangfolge ändern, so dass zum Beispiel %bar% wird immer vorher ausgeführt %foo%? Im obigen Beispiel wäre dies das Gleiche wie:

x %foo% (y %bar% z)

Antworten:

5 für die Antwort № 1

Ich glaube nicht, dass dies explizit dokumentiert ist, aber implizit im R-Sprachdokumentation Infix-Operatoren haben alle dieselbe Priorität und werden daher von links nach rechts ausgeführt. Dies kann wie folgt gezeigt werden:

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

Die einzige Option, die mir einfällt, wäre zuDefinieren Sie einen der vorhandenen Operatoren neu, um das zu tun, was Sie wollten. Dies hätte jedoch Auswirkungen, so dass Sie die Funktion auf eine Funktion beschränken möchten.

Es ist auch erwähnenswert, dass mit substitute ändert nicht die Vorrangigkeit des Operators, die beim ersten Schreiben des Ausdrucks festgelegt wurde

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

2 für die Antwort № 2

Wie kann ich die Operator-Priorität von% foo% und% bar% bestimmen?

Sie können "t" nicht zulassen, dass Sie die Priorität von benutzerdefinierten Infix-Operatoren festlegen. Benutzerdefinierte Infix-Operatoren haben die Standardvorrangregeln, dh sie werden von links nach rechts ausgewertet.

Ein Grund für diese Einschränkung ist, dass dies der Fall wäreEs ist äußerst schwierig und einschränkend, eine Reihe von Präferenzregeln für Infix-Operatoren zu implementieren und aufrecht zu erhalten. Stellen Sie sich vor, Sie haben ein R-Paket geladen, das mit einigen benutzerdefinierten Infix-Operatoren geliefert wird. Dann die Beziehung der Infix-Operatoren vom Paket zum %foo% und %bar% die Sie erstellt haben, müsste definiert werden. Dies wird schnell zu einer ernsthaften Belastung.

Stellen Sie sich zum Beispiel vor, dass das Paket einen Infix-Operator enthält %P1IF% und Paket zwei enthält den Infix-Operator %P2IF%. Für jedes Paket wurde festgelegt, dass der Infix-Operator die höchste Priorität hat. Wenn Sie Paket eins und zwei laden würden, wäre 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 der Vorrang sein könnte, kann das Ergebnis für eines der beiden Pakete falsch sein.