2015-06-25 32 views
5

Załóżmy, że mam dwóch niestandardowych operatorów infiksów w R: %foo% i %bar%.W R, w jaki sposób mogę określić pierwszeństwo operatorów zdefiniowanych przez operatorów infiksów?

Mam wyrażeń, które korzystają zarówno operatorów, takich jak:

x %foo% y %bar% z 

Jak mogę określić pierwszeństwo operatorowi %foo% i %bar%?

Jak zmienić pierwszeństwo, aby na przykład %bar% zawsze było wykonywane przed %foo%? W powyższym przykładzie byłoby to tak samo jak:

x %foo% (y %bar% z) 

Odpowiedz

5

nie sądzę, to jest wyraźnie udokumentowane, ale ukryte w R language documentation to, że operatorzy Infix są równego pierwszeństwa i tak są wykonywane od lewej do prawej . Można to wykazać w następujący sposób:

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

Jedynym rozwiązaniem można myślę, byłoby przedefiniować jeden z istniejących operatorów robić to, co chciałeś. Jednak samo to może mieć reperkusje, więc możesz chcieć ograniczyć je do funkcji.

Warto również zauważyć, że za pomocą substitute nie zmienia pierwszeństwo operatora już ustawione, gdy wyrażenie jest pierwsza pisemna:

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

Jak mogę określić pierwszeństwo operatorowi% foo% i% bar% ?

Nie możesz. R nie pozwala ustawić priorytetu niestandardowych operatorów infiksów. Operator infix zdefiniowany przez użytkownika ma domyślne reguły pierwszeństwa, co oznacza, że ​​będą oceniane od lewej do prawej.

Jednym z powodów tego ograniczenia jest to, że niezwykle trudne i ograniczające byłoby wdrożenie i utrzymywanie zestawu reguł precendence dla operatorów infiksów. Wyobraź sobie, że załadowałeś pakiet R, który jest dostarczany z niestandardowymi operatorami infiksów. W takim przypadku należy zdefiniować relację operatorów infiksów z pakietu do utworzonych przez użytkownika %foo% i %bar%. To szybko stanie się poważnym ciężarem.

Jako przykład wyobraź sobie, że pakiet jeden zawiera operatora infiksu %P1IF%, a drugi pakiet zawiera operatora infiksów %P2IF%. Każdy pakiet zdefiniował, że jego operator infiksowania powinien mieć najwyższy priorytet. Jeśli było załadować zarówno jeden pakiet i dwa, a następnie następujące wyrażenie będzie niezdefiniowana:

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 

Niezależnie od tego, co pierwszeństwo może być wynikiem jednego z dwóch pakietów może być nieprawidłowe.