`{` Класс? - PullRequest
       18

`{` Класс?

0 голосов
/ 22 мая 2018

Меня интересуют способы модификации базовых функций с минимальным кодом на R. Я знаю, что функция body вернет тело любой функции.Поэтому я сохранил вывод body(basefoo) в переменной bar.Желая узнать больше о том, как это работает, я проверяю класс bar.который был "{".Я думал, что это был странный класс.Я искал методы, но methods(class="\\{"), но там говорится, что методов нет.

Есть ли причина, по которой существует класс {?Как можно модифицировать или взаимодействовать с { объектами?

1 Ответ

0 голосов
/ 22 мая 2018

Весь код R перед выполнением анализируется в дереве (см. Выражения из Advanced R для получения дополнительной информации).Чтобы иметь несколько выражений в любой точке дерева, R должен создать оболочку / контейнер для хранения этих выражений.И это в основном то, что представляет класс {.Он определяет блок кода.Это коллекция выражений для оценки.Подумайте, если это как функция, где каждое выражение, которое вы хотите оценить, является параметром (по крайней мере, так оно и хранится в дереве).А блоки кода просто возвращают значение, возвращаемое последним выражением.Сравните

as.list(quote({a; b}))
# [[1]]
# `{`
# [[2]]
# a
# [[3]]
# b
as.list(quote(c(a, b)))
# [[1]]
# c
# [[2]]
# a
# [[3]]
# b

Видите, как они превращаются в подобные структуры в R?За «именем функции» сначала следует список параметров.Вы даже можете вызвать { как обычную функцию

`{`(a<-1, 5, a+2)
# [1] 3

(обратите внимание, что последнее значение является единственным возвращаемым значением).Также обратите внимание, что блоки кода не создают свою собственную область видимости, поэтому переменная a будет определена в глобальной среде, если вы запустите ее на консоли.

Вы можете создать объект этого типа, просто заключив в кавычкикодовый блок

class(xx <- quote({a; b}))
# [1] "{"
xx
# {
#     a
#     b
# }

или путем создания вызова с символами в кавычках

class(xx <- as.call(list(quote(`{`), quote(a), quote(b))))
# [1] "{"
xx
# {
#     a
#     b
# }

И это не всегда тот случай, когда тело функции будет иметь класс {.Например,

x <- function(a) a+1
y <- function(a) {b <- sqrt(a); b+2}
class(body(x))
# [1] "call"
class(body(y))
# [1] "{"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...