Это старая версия (1.275) ЯзыкR.

Содержание

Язык R


ToDo статьи:

Общее описание языка R

R — простой и полезный язык для статистики, машинного обучения и DataMining, распространяемый по лицензии GNU GPL 2.

Главная страница проекта: http://www.r-project.org/

Скачать дистрибутивы R можно здесь (российское зеркало): http://cran.gis-lab.info/ (доступны версии для UNIX (Linux), Windows, OS X). Для пользователей Ubuntu и Debian скачивать ничего не нужно: можно установить пакеты r-base, r-base-dev, r-base-cor:

 $ sudo apt-get update && apt-get install r-base r-base-dev r-base-core

Более подробно об установке R можно прочитать тут http://cran.r-project.org/doc/manuals/r-release/R-admin.html

История создания

В 1976 году сотрудники AT&T Bell Labs: Джон Чамберс, Рик Беккер и Алан Вилкс — создали язык программирования S (от англ. «statistics»).

В 1993 году в стране, где на десять жителей приходится двадцать овец, три хоббита и два эльфа, двумя сотрудниками Оклендского университета Россом Ихака и Робертом Джентльменом (это не шутка-) на основе языка S был разработан язык R. Язык, как и его предшественник, был разработан преимущественно для статистических целей, а его название было подражанием названию S, кроме того, это была первая буква имен разработчиков (несмотря на то, что полное имя Росса Ихака — Джордж Росс Ихака). Разработчик языка S Джон Чамберс входит в R Core Team.

Соглашения оформления кода

Оператор присвоения <- вместо =


  • К: использовал «венгерскую нотацию» по чисто педагогическим причинам (и далеко не везде). Незнакомым с программированием (экономистам, биологам и пр.) гораздо проще понимать на начальном уровне (сужу по себе, кстати) --АтрашкевичАндрей
  • К: А может ну его, хлам этот с точками? Запутывает же. Попробую переписать в lowCamelCase, так должно быть понятнее. --АтрашкевичАндрей

Программа «Hello, world!»

Для присвоения переменной значения в R используется оператор <-. Оператор = также поддерживается, но не соответствует соглашениям. Поэтому во всех дальнейших примерах использовует только оператор <-.

 > str.hw <- "Hello, world!"
 > + print(str.hw)
 \[1] "Hello, world!"

R чувствителен к регистру, поэтому будьте внимательны и соблюдайте соглашения оформления кода.

 str.hw <- "Hello, world!"
 print(str.HW)
 Ошибка в print(str.HW) : объект 'str.HW' не найден

Оператор присвоения работает в обе стороны, поэтому можно писать как <-, так и ->.

 # в R нет многострочных комментариев
 "Hello, world!" -> str.hw
 str.hw  # так удобнее всего, наверное, удобнее всего выводить на печать
 \[1] "Hello, world!"

Иногда удобно вывести на печать переменную сразу после присвоения значения. Для этого используется заключение операции присвоения в круглые скобки.

 (str.hw <- "Hello, world!")
 \[1] "Hello, world!"

R как калькулятор

Все имеющиеся т.н. «статистические» пакеты можно условно разделить на три категории:

  • библиотеки высокоуровневых ЯП (Seismic UNIX в Си, Pandas в Python) и специализированные языки для математических (включая статистические) вычисления: GNU Octave, Julia, MATLAB, MATCAD
  • «взбесившиеся» научные калькуляторы: помимо R к ним относятся Gretl (GNU Regression, Econometrics and Times-series Library), GAUSS, EViews.
  • «взбесившиеся» табличные процессоры: работа с ними напоминает MS Excel, у которого оставили только VBA-редактор (например, SAS Base — фактический стандарт в банковской и страховой индустриях, STATA или Statistica) или существенно урезали возможности редактирования редактирования ячеек и «кнопочные» функции и меню (SPSS и SAS Enterprise Guide).

R можно использовать как хороший научный и статистический калькулятор.

С его помощью можно выполнять элементарные арифметические действия:

 2 + 2
 \[1] 4

Можно выполнять чуть более сложные:

 12 + 5 * (3 - 7) + 24/4.8
 \[1] -3

Можно работать через переменные:

 a <- 2
 b <- 3
 (c <- a + b)
 \[1] 5
 (c <- c + 6)
 \[1] 11

А можно использовать и для довольно сложных вычислений. В примере - вычисление значения функции Гомпертца.

 a <- 0.993  # верхняя ассимптота
 b <- -2.63  # смещение по t
 d <- -1.257  # масштабированием по t
 t <- 6.2567  # момент времени
 gompertz.value <- a * exp(b * exp(d * t))
 # функция cat() объединяет свои аргументы в одну строку
 # "\n" означает перевод каретки на новую строку
 cat("Gompertz Value = ", gompertz.value, "\n")
 Gompertz Value =  0.9919975

Векторы

Векторы в R — один из наиболее часто используемых объектов. Вектор в R понимается не как элемент векторного пространства (то есть не в строгом математическом смысле), а как набор однородных данных. Можно сказать, что вектор в R — массив (или контейнер) однородных данных.

Для инициализации переменной-вектора кроме оператора присвоения <- используется также оператор c(). С его помощью можно создать любой вектор, включая «пустой», т.е. не содержащий ни одного значения. Длина такого вектора будет равняться нулю.

 (vec.empty <- c())
 NULL
 length.of.vec.empty <- length(vec.empty)
 length.of.vec.empty
 \[1] 0

Вектор можно задать простым перечислением его элементов.

 vec.first <- c(1, 5, 12, 6.78, 5.4645)
 vec.first
 \[1]  1.0000  5.0000 12.0000  6.7800  5.4645

Нумерация элементов вектора начинается с 1, а не с 0, как, например, в Си (а также во многих других языках программирования). Чтобы указать определенный элемент или элементы вектора используются квадратные скобки.

 vec.first <- c(1, 5, 12, 6.78, 5.4645)
 vec.first\[1]
 \[1] 1
 vec.first\[4]
 \[1] 6.78
 vec.first\[2:4]
 \[1]  5.00 12.00  6.78

Векторы имеют фундаментальное значение в R. Например, в циклы в R проходят по элементам вектора. Поэтому есть еще один способ задания векторов.

 vec.one.to.five <- 1:5
 vec.one.to.five
 \[1] 1 2 3 4 5

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

 vec.seven.to.eleven.without.eight <- c(7, 9:11)
 vec.seven.to.eleven.without.eight
 \[1]  7  9 10 11
 vec.one.to.ten.without.six.and.eight <- c(vec.one.to.five, vec.seven.to.eleven.without.eight\[1:3])
 vec.one.to.ten.without.six.and.eight
 \[1]  1  2  3  4  5  7  9 10

При указании элементов вектора в квадратных скобках можно указывать вектор, задающий индексы.

 vec.one.to.ten.without.six.and.eight\[c(1, (5:7))]
 \[1] 1 5 7 9

Числа в R - это вектора единичной длины. Именно в этом смысле стоит понимать широко распространенную фразу, что в R нет числовых скаляров. В реальности скаляры в R присутствуют (например, возможные значения булевых переменных: TRUE и FALSE).

Числовые вектора в R — важный, но частный случай. Вектор, как контейнер данных, может хранить и нечисловые значения. Можно задать вектор, состоящий из строк.

 vec.second <- c("one", "two", "three")
 vec.second\[2]
 \[1] "two"

Если в векторе встречаются и строки, и числа, то все элементы вектора, будут строками

 str.vec <- c(1, "two", 3)
 # функция is.numeric() возвращает ИСТИНА, если ее аргумент - число, иначе ЛОЖЬ
 is.numeric(str.vec\[1])
 FALSE

Функции, ветвления и циклы

Синтаксис любой функции в R выглядит следующим образом:

 FunctionName <- function(<argument.1> <, argument.2> <, ...>){
   # code
   <return(value.to.return)>
 }

Можно использовать упрощенный синтаксис (что делать крайне не советую — АтрашкевичАндрей)

 FunctionName <- function(<argument.1><, argument.2><, ...>){ 
   # code here

Показан только синтаксис, соответствующий объявленным выше соглашениям оформления кода.


 # квадрат числа
 FuncSquareOfTheNumber <- function(x) 
   x^2
 value.for.func.one <- 2.75
 result.of.func.one <- FuncSquareOfTheNumber(value.for.func.one)
 \[1] 7.5625

 # экспонента числа минус его куб
 FuncExpMinusCube <- function(x){
   result <- exp(x)
   result <- result - x**3 # степень можно записать и как "^", и как "**"
   return(result)
 }
 FuncExpMinusCube(6.5)

Вычисление факториала

Синтаксис цикла for:

 for(iterator.name in start.value:stop.value){
   # code
 }

Если необходимо задать шаг итерации, то запись несколько отличается:

 for(itarator.name in seq(start.value, stop.value, by = by.value)){
   # code
 }

 # инкрементное решение

%NF FuncFactorialIteraion? <- function(n){

  stopifnot (n > 0)  # если условие в скобках не ИСТИНА, значит прекращается исполнение
  factorial <- 1
  for (i in 1:n) {
    factorial <- factorial * i
   }
  return(factorial)
} FuncFactorialIteraion?(5) %NE

Для проверки условий ветвлений используются логические выражения (принимающие одно из возможных значений: ИСТИНА или ЛОЖЬ). Для записи логических выражений используются логические операторы И, ИЛИ, НЕ. В синтаксисе R: &, |, ! — соответственно.

Синтаксис ветвления:

 #condition.1, ..., condition.N - логические выражения
 if (condition.1) {
   # code если условие condition.1 - ИСТИНА
 } else if (condition.2) {
   # code если условие condition.2 - ИСТИНА
 # ...
 } else if (condition.N) {
   # code если условие condition.N - ИСТИНА 
 } else {
   # code если condition.1 ... condition.N все ЛОЖЬ
 }

 # рекурсивное решение

%NF FuncFactiorialRecur? <- function(n) {

  stopifnot (n >= 0)
  if (n == 0) {
    return(1)
  } else {
    return(n * FuncFactiorialRecur?(n - 1)) #вызов функции из самой себя
  }
} FuncFactiorialRecur?(4) %NE

Числа Фибоначчи

%NF

 # последовательность Фибоначчи F = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...}
FuncFibonacci? <- function(n) {
  stopifnot (n > 0)
  if (n == 1) {
    return(0)
  } else if (n == 2) { #обратите внимание на пробел между else и if
    return(1)
  } else {
    return(FuncFibonacci?(n - 1) + FuncFibonacci?(n - 2))
  }
} FuncFibonacci?(8) %NE

Использование языка

Сравнение с другими языками

Следующей монокультурой в пространстве статистических языков программирования по моим прогнозам (АтрашкевичАндрей) должен стать язык Julia. Уже есть некоторые указания на то, что этот процесс запущен и идет. Например, Julia начинают пиарить в «илитных» ВУЗах и факультетах по математическим методам в экономике и по прикладной математике в экономике. До R монокультурой был EViews (пиарился эконометристами РЭШ) и, частично, gretl (пиарился эконометристами ВШЭ). Монокультурой на ПМ-ПУ СПбГУ (привсем уважении) был, есть и остается MATLAB (и его детище SimuLink). Хотя 98% «экономистов» дальше =СУММЕСЛИ() в MS Excel вообще ничего никогда не используют.

Литература

  1. R Language Definition. Version 3.1.2 (2014-10-31) DRAFT / R Core Team. — 2014. — 60 p. — http://cran.r-projec....
  2. Venables, W. N. An Introduction to R. Notes on R: A Programming Environment for Data Analysis and Graphics. Version 3.1.2 (2014-10-31) / W. N. Venables, D.M. Smith, Core Team R. — W. N. Venables, D. M. Smith and the R Core Team, 2014. — 105 p. — http://cran.r-projec....
  3. Paradis, E. R for beginners / E. Paradis. — 2005. — 72 p. — http://cran.r-projec....
  4. Matloff, N. The Art of R Programming / Norman Matloff. — 2009. — 193 p. — http://heather.cs.uc....

К: The Art of R Programming — книга для тех, кто знаком (и знаком неплохо) с программированием. В ее приложениях находится хороший список литературы, включая ссылки на интернет-источники. --АтрашкевичАндрей


КатегорияЯзыкиПрограммирования