Библиотека сайта 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.