Объясняет ли приоритет оператора разницу в этих выражениях, включающих умножение числового значения на логическое с отрицанием?

У меня есть три выражения, каждое из которых включает умножение на логическое или его отрицание. Эти логики и их отрицание представляют индикаторные переменные, так что выражения оцениваются условно:

-2*3*!T + 5*7*T
5*7*T + -2*3*!T 
(-2*3*!T) + 5*7*T

Я ожидаю, что приведенное выше даст тот же результат. Однако:

> -2*3*!T + 5*7*T
[1] 0          # unexpected!
> 5*7*T + -2*3*!T 
[1] 35
> (-2*3*!T) + 5*7*T
[1] 35

Я уверен, что это как-то связано с оператором приоритет и приведение типов, но я не могу понять, как вообще имеет смысл оценивать !T после *.


person Alex    schedule 01.11.2016    source источник
comment
Почти наверняка проблема с ! как -2*3*(!T) + 5*7*T тоже работает.   -  person thelatemail    schedule 02.11.2016
comment
Спасибо, похоже, лучше всего в таких выражениях сначала заключать отрицания в скобки.   -  person Alex    schedule 02.11.2016
comment
Также актуально - stackoverflow.com/questions/17651687 / Что предлагает также посмотреть на codetools::showTree(quote( -2*3*(!T) + 5*7*T )) против codetools::showTree(quote( -2*3*!T + 5*7*T )), если вы знакомы с кодом Lisp.   -  person thelatemail    schedule 02.11.2016
comment
Спасибо. Это было именно то, что я искал, я просто не знал, как это искать.   -  person Alex    schedule 02.11.2016
comment
Голоса за закрытие неверны; это хороший и ясный вопрос. Оператор логического не R действительно имеет ошибку приоритета, мы все учимся на собственном горьком опыте. Когда я попал в нее (в сложном выражении), это стоило мне › 10 часов ломания головы.   -  person smci    schedule 02.11.2016
comment
@smci, спасибо. К сожалению, иногда просто невозможно заставить кого-либо увидеть причину в любое время;)   -  person Alex    schedule 03.11.2016
comment
@ Алекс, мы пытаемся найти причину для буквы «Р» ... или наоборот?   -  person smci    schedule 03.11.2016


Ответы (1)


Вы совершенно правы, что речь идет о приоритете оператора. Как указано в ?base::Syntax (на который вы ссылаетесь выше), ! имеет более низкий приоритет, чем все арифметические операторы, поэтому первое выражение эквивалентно

(-2*3)*!(T + 5*7*T)  

(поскольку выражение, содержащее !, должно быть оценено до того, как можно будет выполнить окончательное умножение) или

-6*!(36)  # T coerced to 1 in numeric operations

or

-6*FALSE  # non-zero numbers coerced to TRUE in logical operations

or

-6*0      # FALSE coerced to 0 in numeric operations
person Ben Bolker    schedule 01.11.2016
comment
Спасибо. Я действительно изо всех сил пытался найти первое выражение, которое вы написали. - person Alex; 02.11.2016