В R, как мога да определя приоритета на оператора на потребителски дефинирани инфикс оператори?

Да предположим, че имам два персонализирани инфикс оператора в R: %foo% и %bar%.

Имам изрази, които използват и двата оператора, като например:

x %foo% y %bar% z

Как мога да определя приоритета на оператора на %foo% и %bar%?

Как мога да променя приоритета, така че например %bar% винаги да се изпълнява преди %foo%? В горния пример това би било същото като:

x %foo% (y %bar% z)

person sdgfsdh    schedule 25.06.2015    source източник


Отговори (2)


Не мисля, че това е изрично документирано, но се подразбира в документацията на езика R е, че всички инфикс оператори са с еднакъв приоритет и затова се изпълняват отляво надясно. Това може да се демонстрира по следния начин:

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

Единственият вариант, за който се сещам, е да предефинирам един от съществуващите оператори, за да прави това, което искате. Това обаче само по себе си би имало последствия, така че може да искате да го ограничите до функция.

Също така си струва да се отбележи, че използването на substitute не променя приоритета на оператора, който вече е зададен, когато изразът е написан за първи път:

eval(substitute(2 + 2 * 3, list(`+` = `*`, `*` = `+`)))
#10
2 * 2 + 3
#7
person Nick Kennedy    schedule 25.06.2015

Как мога да определя приоритета на операторите на %foo% и %bar%?

не можеш R не ви позволява да зададете приоритет на потребителски инфикс оператори. Дефинираните от потребителя инфикс оператори имат правилата за приоритет по подразбиране, което означава, че ще бъдат оценени отляво надясно.

Една от причините за това ограничение е, че би било изключително трудно и ограничаващо прилагането и поддържането на набор от правила за приоритет за инфикс оператори. Представете си, че сте заредили R пакет, който идва с някои потребителски инфикс оператори. След това ще трябва да се дефинира връзката на инфикс операторите от пакета към %foo% и %bar%, които сте създали. Това бързо ще се превърне в сериозно бреме.

Като пример, представете си, че пакет едно съдържа инфикс оператор %P1IF%, а пакет две съдържа инфикс оператор %P2IF%. Всеки пакет е определил, че неговият инфикс оператор трябва да има най-висок приоритет. Ако трябваше да заредите пакет едно и две, тогава следният израз ще бъде недефиниран:

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

Независимо какъв може да е приоритетът, резултатът за един от двата пакета може да е неправилен.

person Tim Biegeleisen    schedule 25.06.2015