Подтвердить что ты не робот

Понимание: `+` (1, `*` (2, 3)) и как лучше его кодировать

Что это за код: `+`(1, `*`(2, 3)) предполагается делать в R? Можно ли его кодировать более типичным способом? Как?

4b9b3361

Ответ 1

Если вы используете операторы с кавычками (например, `+` или `*`), вы фактически используете стандартные операторы с типичным синтаксисом function.

Скажем, вы хотите вычислить 1 + 2 таким образом. Вы можете сделать это следующим образом:

`+`(1, 2) ## Please call the sum operator using 1 and 2 as arguments.

Итак, поскольку вы отправили выражение `+`(1, `*`(2, 3)), это в основном оператор sum, для которого аргументы 1 и результат оператора произведения, для которого аргументы 2 и 3.

В итоге типичный способ сделать это - 1 + (2 * 3).

Ответ 2

Очевидно, что это специфично для R, но многие другие языки программирования тоже используют его. Правильный термин действительно Польская нотация, и это стало способом однозначного определения порядка без необходимости скобки, что очень удобно для парсеров/интерпретаторов.

Здесь есть хорошая информация здесь, если вы хотите прочитать больше.

Ответ 3

Это "прямая" функция, вызывающая R. Напомним, что все является функцией, даже операторами. Более подробные сведения приведены в руководстве по языку R, раздел 3 "Оценка выражений" .

Короче говоря, у вас есть 1 + 2 * 3 как изнутри:

  • Сначала мы имеем 2 * 3, поскольку функция умножения называется
  • Его результатом является второй аргумент в добавлении к 1.

Ответ 4

Это показывает, как начать следовать дереву синтаксиса этого "функционального" выражения, используя "[" и "[[" операторы для вытягивания ветвей дерева. Выражение в R хранится в списках:

> quote(`+`(1, `*`(2, 3)))[1]
`+`()
> quote(`+`(1, `*`(2, 3)))[2]
1()
> quote(`+`(1, `*`(2, 3)))[[2]]
[1] 1
> quote(`+`(1, `*`(2, 3)))[3]
(2 * 3)()
> quote(`+`(1, `*`(2, 3)))[[3]]
2 * 3

Обратите внимание, что это то же дерево синтаксического разбора, что и более условная нотация:

> quote(1+(2*3))[1]
`+`()
> quote(1+(2*3))[2]
1()
> quote(1+(2*3))[3]
(2 * 3)()
> quote(1+(2*3))[4]
NULL()
> quote(1+(2*3))[3][1]
(2 * 3)()
> quote(1+(2*3))[3][[1]]
(2 * 3)
> quote(1+(2*3))[3][[1]][[1]]
`(`
> quote(1+(2*3))[3][[1]][[2]]
2 * 3
> quote(1+(2*3))[3][[1]][[2]][[1]]
`*`
> quote(1+(2*3))[3][[1]][[2]][1]
`*`()
> `+`(1, `*`(2, 3))
[1] 7

И вы можете восстановить нотацию infix:

> quote(`+`(1, `*`(2, 3)))[c(1,2,3)]
1 + 2 * 3

> z <- quote(`+`(1, `*`(2, 3)))
> z[1:length(z)]
1 + 2 * 3