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

Оператор Parsing "->" в R

Мой вопрос заключается в разборе выражений в языке R. Позвольте мне сразу перейти к примеру:

fun_text <- c("
0 -> var
f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}

(function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2

f3 = function(x)
{
  0 -> sum_var
  sum_var2 = 0
  sum_var3 <- 0
}

")

fun_tree <- parse(text=fun_text)
fun_tree 
fun_tree[[1]]
fun_tree[[2]]
fun_tree[[3]]
fun_tree[[4]]

После этого мы получим следующие результаты:

expression(0 -> var, f1 <- function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
}, (function()
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})->f2, f3 = function(x)
{
    0 -> sum_var
    sum_var2 = 0
    sum_var3 <- 0
})

и

var <- 0

и

f1 <- function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}

и

f2 <- (function() {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
})

и

f3 = function(x) {
    sum_var <- 0
    sum_var2 = 0
    sum_var3 <- 0
}

Как вы можете видеть, все операторы присваивания "- > " меняются на "< -", но не в первом примере (только "fun_tree" ). Мой вопрос: почему? и могу ли я быть уверенным, что я всегда получаю оператор "< -" в дереве синтаксиса, поэтому я не могу потрудиться при реализации "- > " случая?

4b9b3361

Ответ 1

Можно ли быть уверенным, что я всегда получаю оператор < - "в дереве синтаксиса

Давайте посмотрим...

> quote(b -> a)
a <- b
> identical(quote(b -> a), quote(a <- b))
[1] TRUE

Итак, назначение -> всегда анализируется как <- (то же самое не true при вызове -> в качестве имени функции! 1).

Ваш первый дисплей выглядит наоборот: parse s keep.source аргумент:

> parse(text = 'b -> a')
expression(b -> a)
> parse(text = 'b -> a', keep.source = FALSE)
expression(a <- b)

1 Вызов <- как функция аналогичен использованию в качестве оператора:

> quote(`<-`(a, b))
a <- b
> identical(quote(a <- b), quote(`<-`(a, b)))
[1] TRUE

Однако нет функции -> (хотя вы можете ее определить), и запись b -> a никогда не вызывает функцию ->, она всегда анализируется как a <- b, которая, в свою очередь, вызывает <- или примитив.