Понижение приоритета инфиксного оператора в R? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать оператор 'implies' для логических переменных в R, чтобы упростить исчисление высказываний. Однако, похоже, что с оператором отрицания играть не очень хорошо. Как показывают последние 4 строки, я должен заключить в скобки отрицательные переменные, чтобы заставить оператор импликации работать правильно.

Я подозреваю, что приоритет оператора - проблема, но я не уверен. И из того, что я прочитал, нет способа изменить приоритет инфиксного оператора. Есть ли способ, которым я мог бы переопределить implies(), чтобы скобки в (!q) %->% (!p) не были нужны?

> implies <- function(p, q) !p | q
> "%->%" <- implies
> 
> p <- c(TRUE, TRUE, FALSE, FALSE)
> q <- c(TRUE, FALSE, TRUE, FALSE)
> p %->% q
[1]  TRUE FALSE  TRUE  TRUE
> !q %->% !p
[1]  TRUE FALSE FALSE FALSE
> (!q) %->% !p
[1]  TRUE FALSE  TRUE  TRUE

1 Ответ

0 голосов
/ 16 января 2019

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     

Возможно, это позволило бы вам написать функцию, которая могла бы изменить выражение для придания ! более высокого приоритета, чем %->%.

В качестве альтернативы, ваша функция может просто выполнить подстановку текста, чтобы перед синтаксическим анализом %->% или ! преобразовать в другой оператор приоритета, а затем изменить его обратно до оценки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...