Действительные выражения для функции котировки

Согласно руководству quote(expr):

expr: любое синтаксически допустимое выражение R

Пока quote(x==y) успешно возвращает вызов x==y, quote(x=y) завершается сбой:

Error in quote(x = y) : supplied argument name 'x' does not match 'expr'

Оба x=y и x==y являются синтаксически допустимыми R-выражениями, не так ли? Почему quote() выходит из строя на x=y?

Ответ 1

Как говорится в ?"=":

Оператор '& может использоваться везде, тогда как оператор' = разрешено только на верхнем уровне (например, в полном выражении, набранном в командной строке) или как одно из подвыражений в скобках список выражений.

Использование = в аргументе quote не использует его на верхнем уровне, поэтому вам нужно поместить его в скобки или круглые скобки, но вы все равно должны быть осторожны, как вы оцениваете это выражение, поскольку правила выше будет применяться.

quote({x=y})
quote((x=y))

Чтобы отправить комментарий:

Как сказал Гэвин Симпсон: в основном "верхний уровень" - это когда вы вводите или запускаете код в приглашении и не находитесь в вызове функции. Возьмите z = quote(expr=x), например. z = quote(...) оценивается на верхнем уровне, но expr=x не потому, что он внутри вызова функции.

В quote(expr=x), = используется для назначения значения x аргументу функции expr; поэтому вы больше не работаете на верхнем уровне, вы создаете список аргументов функции (парный список). Причина quote(x=y) не выполняется, потому что quote не имеет аргумента x.

Контекст верхнего уровня кратко описан в R Internals, в Раздел 1.4, Контексты.