R не имеет никакого способа контролировать приоритет оператора. Это описано на странице справки ?Syntax
. Ваша проблема в том, что отрицание имеет более низкий приоритет, чем специальные операторы, поэтому
!q %->% !p
анализируется как
!(q %->% !p)
Вероятно, лучший совет - не пытаться использовать R для проекта, над которым вы работаете, поскольку он не предназначен для такого рода вещей. Однако то, что вы хотите, может быть возможным: R позволяет вам видеть дерево разбора из выражения и сообщает, где встречаются скобки:
> getParseData(parse(text="!q %->% !p"))
line1 col1 line2 col2 id parent token terminal text
11 1 1 1 10 11 0 expr FALSE
1 1 1 1 1 1 11 '!' TRUE !
10 1 2 1 10 10 11 expr FALSE
2 1 2 1 2 2 4 SYMBOL TRUE q
4 1 2 1 2 4 10 expr FALSE
3 1 4 1 7 3 10 SPECIAL TRUE %->%
9 1 9 1 10 9 10 expr FALSE
5 1 9 1 9 5 9 '!' TRUE !
6 1 10 1 10 6 8 SYMBOL TRUE p
8 1 10 1 10 8 9 expr FALSE
Возможно, это позволило бы вам написать функцию, которая могла бы изменить выражение для придания !
более высокого приоритета, чем %->%
.
В качестве альтернативы, ваша функция может просто выполнить подстановку текста, чтобы перед синтаксическим анализом %->%
или !
преобразовать в другой оператор приоритета, а затем изменить его обратно до оценки.