Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Обзор языка программирования GNU R

Оригинал: An overview of GNU R programming language
Автор: Renata Rendek
Дата публикации: февраль 2013 года
Перевод: А. Кривошей
Дата перевода: июнь 2013 г.

1. Введение

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

2. Выражения

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

Примеры выражений в R:

> y<-100
> if (1==1) 1 else 0
[1] 1
> 100/5
[1] 20

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

> "LinuxCareer.com";sin(pi);5^7
[1] "LinuxCareer.com"
[1] 1.224647e-16
[1] 78125

3. Объекты

Объект можно рассматривать как элементарный компонент ("thing") языка программирования R. Например, объектами являются:
- числовой вектор;
- символьный вектор;
- список;
- функция.
Примеры объектов в R:

> c(1,5,2,7,9,0)
[1] 1 5 2 7 9 0
> c("GNU R programming tutorial","LinuxCareer.com")
[1] "GNU R programming tutorial" "LinuxCareer.com"           
> list("GNU R programming tutoial",c(1:5),"this is also an object in R")
[[1]]
[1] "GNU R programming tutoial"

[[2]]
[1] 1 2 3 4 5

[[3]]
[1] "this is also an object in R"

> function(a,b) {a/b}
function(a,b) {a/b}

4. Символы

Символ в R - это имя переменной. Поэтому, если вы присваиваете объект переменной, тем самым вы присваиваете объект символу. Окружение в R представляет собой набор таких символов, созданных для определенной цели.

Пример символов в R:

> x<-3
> y<-"R tutorial"

В примере выше x и y являются символами.

5. Функции

В R функция - это объект, который получает в качестве аргументов другие объекты, и в качестве результата тоже возвращает объект. Знали ли вы, что в R оператор присваивания "<-" является функцией? Вместо выражения:

> a<-1

вы можете вызвать функцию "<-" с аргументами "a" и "1", как показано ниже:

> '<-'(a,1)

Несколько примеров функций в R:

"<-" - присваивание;
"+" - суммирование;
"if" - оператор;
"[" ссылка на вектор.

Примеры использования функций в R:

> '+'(1,1)
[1] 2
> 'if'(1>3,"one greater than three", "one less than three")
[1] "one less than three"
> '['(a,1)
[1] 1

6. Другие особенности языка R

6.1. Объекты в R не изменяются

В R объекты не изменяются. Это значит, что R будет копировать объект, а не только ссылку на объект. Рассмотрим следующий объект. Мы определяем функцию, которая присваивает i-му элементу вектора x значение 4, как показано ниже:

> f<-function(x,i){x[i]<-4}

Давайте посмотрим, что произойдет, если мы определим вектор w и передадим его в качестве аргумента в функцию f.

> w<-c(1,3,6,7)
> f(w,1)
> w
[1] 1 3 6 7

Мы видим, что вектор w, когда он передается функции, просто копируется, поэтому функция не модифицирует сам вектор.

6.2. В R все есть объект

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

> functionname<-function(x,y) x+y
> functionname
function(x,y) x+y

6.3. Специальные значения в R

В R имеются некоторые специальные обозначения. Это:
NA - используется для представления отсутствующих значений, означает "not available";
Inf или -Inf - результат вычислений, когда полученное число слишком велико, слишком мало, или имеет место деление на нуль;
NaN - результат вычислений, который не может существовать, например при делении нуля на нуль, означает "not a number";
NULL - часто используется в качестве аргумента функций, означает, что этому аргументу не присвоено никакого значения.

6.4. Приведение типов данных

R часто приводит данные одного типа к другому. Например, когда вы вызываете функцию с аргументом неправильного типа, R пытается конвертировать этот аргумент, чтобы функция могла работать. Другим примером является случай, когда мы определяем вектор с числовыми значениями. В этом случае R присваивает вектору тип "integer":

> x<-c(1:10)
> typeof(x)
[1] "integer"

Теперь, если мы изменим значение четвертого элемента вектора x, R автоматически изменит тип вектора на "double":

> x[4]<-4.1
> typeof(x)
[1] "double"

6.5. Интерпретатор R

Интерпретатор - это программа, которая выполняет написанный код. Нет необходимости компилировать код R, как в случае C, C++ или Java. Это означает, что R является интерпретируемым языком.
Интерпретатор R обрабатывает выражения R в несколько этапов. Во-первых, он анализирует выражения и переводит их в соответствующую функциональную форму. Давайте вызовем функцию quote(), чтобы посмотреть, как это происходит.

> typeof(quote(if(1>3) "one is greater than three" else "one is less than three"))
[1] "language"

Вышеприведенное выражение возвращает объект "language". Чтобы увидеть, как R обрабатывает выражение, мы создаем дерево синтаксического разбора.

> as(quote(if(1>3) "one is greater than three" else "one is less than three"),"list")
[[1]]
'if'

[[2]]
1 > 3

[[3]]
[1] "one is greater than three"

[[4]]
[1] "one is less than three"

Теперь давайте применим функцию typeof() с элементам такого списка, который покажет, как в R интерпретируется выражение.

> lapply(quote(if(1>3) "one is greater than three" else "one is less than three"),typeof)
[[1]]
[1] "symbol"

[[2]]
[1] "language"

[[3]]
[1] "character"

[[4]]
[1] "character"

Как вы можете видеть, некоторые части оператора if не включаются в анализируемое выражение. Это элемент else. Кроме того, интересно отметить, что первый элемент списка - это символ, который указывает на функцию if(). Даже несмотря на то, что синтаксис оператора if отличается от вызова функции, интерпретатор R транслирует выражение в вызов функции с именем функции в качестве первого аргумента и другими аргументами, как в списке выше.

7. Заключение

Эта статья является введением в язык программирования R. В следующих статьях мы детально рассмотрим описанные здесь элементы языка R.