/ / Dans R, comment puis-je déterminer la priorité des opérateurs infixés définis par l'utilisateur? - r, opérateurs, priorité des opérateurs, notation infixe

Dans R, comment puis-je déterminer la priorité des opérateurs infixés définis par l'utilisateur? - r, opérateurs, priorité des opérateurs, notation infixe

Supposons que j'ai deux opérateurs infixes personnalisés dans R: %foo% et %bar%.

J'ai des expressions qui utilisent les deux opérateurs, telles que:

x %foo% y %bar% z

Comment puis-je déterminer la préséance de l'opérateur sur %foo% et %bar%?

Comment puis-je changer la priorité afin que, par exemple, %bar% exécute toujours avant %foo%? Dans l'exemple ci-dessus, ce serait la même chose que:

x %foo% (y %bar% z)

Réponses:

5 pour la réponse № 1

Je ne pense pas que cela soit explicitement documenté, mais implicite dans le Documentation en langage R est-ce que les opérateurs infixes ont tous la même priorité et sont donc exécutés de gauche à droite. Cela peut être démontré comme suit:

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

La seule option à laquelle je peux penser serait deredéfinissez l'un des opérateurs existants pour faire ce que vous vouliez. Cependant, cela aurait des répercussions et vous voudrez peut-être le limiter à une fonction.

Il convient également de noter que l’utilisation de substitute ne modifie pas la priorité des opérateurs déjà définie lors de la première écriture de l'expression:

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

2 pour la réponse № 2

Comment puis-je déterminer la priorité de l'opérateur de% foo% et% bar%?

Vous ne pouvez pas "t. R" vous autoriser à définir la priorité des opérateurs d'infixe personnalisés. Les opérateurs infixes définis par l'utilisateur ont les règles de priorité par défaut, ce qui signifie qu'ils seront évalués de gauche à droite.

Une des raisons de cette limitation est qu’il seraitêtre extrêmement difficile et contraignant d’implémenter et de maintenir un ensemble de règles de priorité pour les opérateurs infixes. Imaginez que vous ayez chargé un paquet R fourni avec des opérateurs infix personnalisés. Ensuite, la relation entre les opérateurs infixe du package et le %foo% et %bar% que vous avez créé aurait besoin d'être défini. Cela deviendra rapidement un lourd fardeau.

Par exemple, imaginez que le paquet 1 contienne infixer operator %P1IF% et le paquet deux contient infixer l'opérateur %P2IF%. Chaque paquet a défini que son opérateur infixe devrait avoir la priorité la plus élevée. Si vous deviez charger les packages un et deux, l'expression suivante serait indéfinie:

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

Indépendamment de ce que la priorité pourrait être le résultat pour l'un des deux packages pourrait être incorrect.