Оценить:
 Рейтинг: 0

Определение языка R. Версия 3.5.2 (2018-12-20) DRAFT

<< 1 2 3 4 5 6 >>
На страницу:
3 из 6
Настройки чтения
Размер шрифта
Высота строк
Поля
2.1.4. Символьные объекты

Символы обращаются к объектам R. Обычно имя любого объекта R – символ. Символы могут быть созданы через функции as.name и кавычку.

Символы имеют режим «name», режим хранения «symbol» и тип «symbol». Они могут быть преобразованы «в» и «из» символьных строк, используя as.character и as.name. Они естественно появляются как атомы проанализированных выражений, попробуй, например, as.list (quote (x + y)).

2.1.5. Выражения – объекты

В R можно иметь объекты типа» expression». Выражение содержит одно или более предложений. Оператор – синтаксически корректный набор маркеров. Объекты выражения – специальные объекты языка, которые содержат проанализированные, но неоцененные операторы R. Основное различие состоит в том, что объект выражения может содержать несколько таких выражений. Другие более тонкие различия состоят в том, что объекты типа «expression» оцениваются лишь при явной передаче на вычисление, тогда как другие объекты языка могут быть оценены в некоторых неожиданных случаях.

Объект выражения ведет себя также как список, и к его компонентам можно получить доступ таким же образом как компонентам списка.

2.1.6 Объекты функции

В R функции – объекты и могут управляться почти таким же способом как любой другой объект. У функций (или более точно, обертка функции) есть три основных компонента: формальный список аргументов, тело и окружающая среда. Список аргументов – список разделенных запятой значений аргументов. Аргумент может быть символом, или конструкцией «symbol = default», или специальным аргументом «…’. Вторая форма аргумента используется для указания значения по умолчанию для аргумента, которое будет использоваться при вызове функция без какого-либо значения, указанного для этого аргумента. Аргумент «…» является особенным и может содержать любое число аргументов. Он обычно используется, если число аргументов неизвестно или в случаях, где аргументы будут переданы другой функции.

Тело – синтаксически проанализированный оператор R, обычно набор операторов в фигурных скобках, но также может быть отдельный оператор, символ или даже константа.

Окружающая среда функции является средой, которая была активной при создании функции. Любой символ ограничен своей окружающей средой, связан и доступен функции. Комбинацию кода функции и привязки в ее окружающей среде называют «оберткой функции», термином из теории функционального программирования. Здесь обычно используется термин «функция», но используется «обертка», чтобы подчеркнуть значимость присоединенной среды.

Можно извлечь и управлять тремя частями обертки объекта, используя конструкции formals, body и environment (все три могут также использоваться на левой стороне присваивания). Последний из них может использоваться для удаления нежелательной привязки среды.

При вызове функции создается новая среда (называемая средой оценки), чье пространство (см. раздел 2.1.10 [Окружающая среда]) является средой от обертки функции. Новая среда первоначально заполнена неоцененными аргументами функции; поскольку оценка продолжается, локальные переменные создаются в ее пределах.

Есть также средство для преобразования функции «в» и «из» списочной структуры, используя as.list и as. function. Они были включены для совместимости с S и их использование обескураживает.

2.1.7. NULL

Существует специальный объект, называемый NULL. Он используется всякий раз, когда есть потребность идентифицировать или указать отсутствие объекта. Его не следует путать с вектором или списком нулевой длины.

Объект NULL не имеет типа и каких-либо поддающихся изменению свойств. В R есть только один объект NULL, к которому обращаются все экземпляры. Для проверки на NULL используют is.null. Нельзя установить атрибуты для NULL.

2.1.8. Встроенные объекты и специальные формы

Эти два вида объекта содержат встроенные функции R, то есть, те, которые выведены на экран как. Primitive в листингах кода (так же как те, к которым получают доступ через функцию. Internal и, следовательно, не видимые пользователем как объекты). Различия между ними заключается в обработке аргумента. Все собственные аргументы встроенных функций оцениваются и передаются внутренней функции в соответствии с вызовом по значению, тогда как специальные функции передают не оцененные аргументы внутренней функции.

Для языка R эти объекты – только другой вид функции. Функция is.primitive может отличить их от интерпретируемых функций.

2.1.9. Обещанные объекты

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

Пока к этому аргументу не получают доступ, не существует какого-либо значения, присоединенного с обещанием. Когда к аргументу получают доступ, сохраненное выражение оценивается в сохраненной окружающей среде и возвращается результат. Результат также сохранен обещанием. Функция замены извлечет контент слота выражения, что позволяет программисту получать доступ или к значению или к выражению, присоединенному с обещанием.

В пределах языка R объекты обещания видимы почти неявно: фактические аргументы функции имеют этот тип. Есть также функция delayedAssign, которая сделает обещание из выражения. Отсутствует какой-либо способ в коде R для проверки, является ли объект обещанием или нет, и при этом нет способа использоватькодR для определения окружающей среды обещания.

2.1.10. Точка-точка-точка

Тип объекта «…» хранится как тип pairlist. К компонентам «…» можно получить доступ обычным pairlist способом из кода C, но не легко получить доступ как к объекту в интерпретируемом коде. Объект может быть получен как список, так, например, в таблице ниже:

args <– list (…)
##…
for (a in args) {
##…

Если функция имеет «…» в качестве формального аргумента, который не соответствует формальным аргументам, то им сопоставляется «…».

2.1.11. Окружающая среда

Будем считать, что окружающие среды могут состоять из двух частей. Фрейм, состоящий из набора пар символ-значение, и обертка — указатель на обертку окружающей среды. Когда R ищет значение для символа, исследуется фрейм и, если соответствующий символ будет найден, его значение будет возвращено. В противном случае получают доступ к обертке окружающей среды, и процесс повторяется. Окружающие среды формируют древовидную структуру, в которой обертки играют роль родителей. Дерево окружающих сред имеет корень в пустой окружающей среде, доступной через emptyenv (), у которой нет родителя. Корень – прямой родитель окружающей среды основного (base) пакета (доступной через функцию baseenv ()). Прежде у baseenv () было специальное значение NULL, но начиная с версии 2.4.0 использование NULL, является не допустимым в качестве окружающей среды.

Окружающие среды создаются неявно вызовами функции, как описано в разделе 2.1.5 [Объекты функции], и разделе 3.5.2 [Лексическая окружающая среда]. В этом случае окружающая среда содержит переменные, локальные для функции (включая аргументы), а ее обертка является окружающей средой вызванной в настоящий момент функции. Окружающие среды также можно создать непосредственно new. env. К контенту фрейма окружающей среды можно получить доступ и манипулирование при помощи ls, get и assign, включая eval и evalq.

Может использоваться функция parent. env для получения доступа к обертке окружающей среды.

В отличие от большинства другихобъектов R, окружающая среда не копируется при передаче в функцию или использовании в присвоениях. Таким образом, если присвоить одну и ту же окружающую среду нескольким символам и изменить одну из них, то другие изменятся также. В частности присвоение атрибутов окружающей среде может привести к неожиданностям.

2.1.12. Объекты парных списков

Объекты парных списков (Pairlist) подобны спискам точечной пары Lisp. Они интенсивно используются внутри R, но редко видимы в интерпретируемом коде, хотя они возвращаются formals, и могут быть созданы, например, функцией pairlist. pairlist с нулевой длиной равен NULL, как ожидался бы в Lisp, но в отличие от списка нулевой длины. У каждого такого объекта есть три слота, значение CAR, значение CDR и значение TAG. Значение TAG – текстовая строка, и CAR и CDR обычно представляют, соответственно, элемент списка (голова) и остаток (хвост) списка с объектом NULL как разделитель (терминология CAR/CDR – традиционна для Lisp и первоначально упоминалась как адрес и декрементные регистры на компьютерах IBM в начале 60-ых).

Парные списки обрабатываются на языкеR точно таким же образом как универсальные векторы («lists»). В частности к элементам получают доступ, используя то же самый синтаксис [[]]. Использование парных списков является сомнительным, так как универсальные векторы обычно более эффективны в использовании. При получении доступа к внутреннему парному списку из R обычно (включая подмножества) преобразуют в универсальный вектор.

В очень немногих случаях парные списки видимы пользователем: одним из таких является. Options.

2.1.13. Тип «Any»

В действительности объект не может иметь тип «Any», что, однако, допустимо для значения типа. Случается при определенных (довольно редких) обстоятельствах, например, as.vector (x,«any») указывает, что не следует делать приведение типа.

2.2. Атрибуты

У всех объектов кроме NULL могут быть один или более атрибутов, присоединенных к ним. Атрибуты сохранятся как pairlist, где все элементы именованы, но их следует рассматривать как ряд пар name=value. Можно получить список атрибутов, используя атрибуты и набор атрибутами <-, к отдельным компонентам получают доступ, используя attr и attr <-.

У некоторых атрибутов есть специальные функции доступа (например, levels <- для факторов), и они должны использоваться при доступности. В дополнение к скрытым деталям реализации они могут выполнить дополнительные операции. R пытается принять вызовы attr <- и attributes <-, которые включают специальные атрибуты, и осуществляет проверку непротиворечивости.

Матрицы и массивы – просто векторы с атрибутом размерности и дополнительно с именем размерности (dimnames), присоединенные к вектору.

Атрибуты используются для реализации структуры класса, используемой в R. Если у объекта есть атрибут класса, то атрибут будет исследован во время оценки. Структура класса в R описана подробно в главе 5 [Объектно-ориентированное программирование].

2.2.1. Имена

Атрибут имени (names) при его присутствии маркирует отдельные элементы вектора или списка. При печати объекта атрибут имени при его присутствии используется для маркировки элементов. Атрибут имен может также использоваться для индексирования результата, например, quantile (x) [«25%»].

Можно получить и определить имена, используя конструкции names и names <-. Последняя выполнит необходимые проверки непротиворечивости, чтобы гарантировать, что у атрибута имен есть надлежащий тип и длина.

Отдельно обрабатываются парные списки и одномерные массивы. Для объектов парных списков (pairlist) используется виртуальный атрибут имен; в действительности атрибут имен создается из тегов компонентов списка. Для одномерных массивов реально имена доступы из имен размерности (dimnames [[1]]).

2.2.2. Размерность

Атрибут размерности используется при реализации массивов. Контент массива сохраняется в векторе в порядке по столбцам, и атрибут размерности является вектором целых чисел, указывающие соответствующие пределы массива. R гарантирует, что длина вектора равна произведению длин размерностей. Длина одной или более размерностей может равняться нулю.
<< 1 2 3 4 5 6 >>
На страницу:
3 из 6