Что это за код: `+`(1, `*`(2, 3))
предполагается делать в R? Можно ли его кодировать более типичным способом? Как?
Понимание: `+` (1, `*` (2, 3)) и как лучше его кодировать
Ответ 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