R — мова програмування і програмне середовище для статистичних обчислень, аналізу та зображення даних в графічному вигляді. Розробка R відбувалась під істотним впливом двох наявних мов програмування: мови програмування S з семантикою успадкованою від Scheme[6]. R названа за першою літерою імен її засновників Роса Іхаки (Ross Ihaka) та Роберта Джентлмена (Robert Gentleman)[7] працівників Оклендського Університету в Новій Зеландії. Незважаючи на деякі принципові відмінності, більшість програм, написаних мовою програмування S запускаються в середовищі R.
R поширюєтся безкоштовно за ліцензією GNU General Public License [8][9] у вигляді вільнодоступого вихідного коду або відкомпільованих бінарних версій більшості операційних систем: Linux, FreeBSD, Microsoft Windows, Mac OS X, Solaris. R використовує текстовий інтерфейс, однак існують різні графічні інтерфейси користувача (див. Графічні Редактори Скриптів та IDE).
R має значні можливості для здійснення статистичних аналізів, включаючи лінійну і нелінійну регресію, класичні статистичні тести, аналіз часових рядів (серій), кластерний аналіз і багато іншого. R легко розбудовується завдяки використанню додаткових функцій і пакетів доступних на сайті Comprehensive R Archive Network (CRAN) [Архівовано 5 січня 2008 у Wayback Machine.]. Більша частина стандартних функцій R, написана мовою R, однак існує можливість підключати код написаний C, C++, або Фортраном. Також за допомогою програмного коду на C або Java [10] можна безпосередньо маніпулювати R об'єктами.
R належить до інтерпретованих мов програмування і для роботи використовується командний інтерпретатор. Наприклад робота R в терміналі має такий вигляд:
> 1+1
[1] 2
R підтримує концепцію об'єктно-орієнтованого програмування (ООП) включаючи generic функції, результат виконання якої залежить від аргументів (типу об'єктів), що передаються generic функції. В мові програмування R всі змінні є об'єктами, кожен об'єкт належить до певного класу.[11] При цьому R має дві класові моделі: S3 та S4. Перша була реалізована від початку існування R, друга була додана у версії 1.7.0 [12] з пакетом methods [Архівовано 27 серпня 2013 у Wayback Machine.]. S3 не є справжньою класовою системою, класи S3-об'єкта визначаються простим атрибутом — вектором символьних рядків:
> q <- 1
> class(q) # перевіряємо клас q
[1] "numeric" # q - число
> class(q) <- c("character", class(q)) # "розширимо" клас q
> q
[1] 1
attr(,"class")
[1] "character" "numeric" # тепер q належить до двох класів
При цьому, при виконанні generic функцій, таких як plot() чи summary(), диспетчер методів шукає в таблиці методів метод, який узгоджується з іменем першого аргумента.
# Генеруємо вибірку з повторами з множини перших 5 літер, розміром у 20 елементів.
# Після чого будуємо факторну таблицю (contingency table)
> m <- table(sample(LETTERS[1:5], size = 20, replace = T))
# щоб дізнатись значення змінної - просто вводимо її ім'я в консолі
> m
A B C D E
4 5 3 2 6
> class(m)
[1] "table" # m - факторна таблиця
> summary(m) # фактично виконується summary.table()
Number of cases in table: 20
Number of factors: 1
> as.vector(m) # m як вектор
[1] 4 5 3 2 6
> summary(as.vector(m)) # виконується summary.default()
Min. 1st Qu. Median Mean 3rd Qu. Max.
2 3 4 4 5 6
Хоча S3 проста система, але вона виявилась досить потужною і зручною саме для інтерактивного аналізу даних. S4 класи не такі "інтерактивні" і вони більше підходять для написання, наприклад, бібліотек. При створенні S4 класу потрібно вказати його ім'я і слоти (тобто поля). При цьому можна вказати від яких класів походить цей клас (це можуть бути S4 і S3 класи), прототип і функцію валідації (за замовченням перевіряється лише відповідність типу слоту і його значення, але можна ввести перевірку самого значення, наприклад, допускати лише числа менші 10).
# Визначаємо S4-клас
AClass <- setClass("AClass" # ім'я класу
, representation(adata = "character", alength = "numeric") # імена слотів та їхні типи/класи
, prototype(adata = "Hello world!", alength = 12) # прототип класу
, validity = function(object){ # функція валідації
if(object@alength < 15) return(T) # якщо alength < 15, то все ок
F # інакше - помилка
}
# наслідуємо AClass додавши новий слот )
BClass <- setClass("BClass", contains= "AClass", slots = c(bdata = "numeric"))
# створюємо об'єкт класу AClass
> AClass()
An object of class "AClass" # оскільки в конструктор нічого не було передано
Slot "adata": # то створюється прототип
[1] "Hello world!"
Slot "alength":
[1] 12
# створюємо інший AClass-об'єкт
> AClass(adata = "Hello another world!", alength = nchar("Hello another world!"))
Error in validObject(.Object) : invalid class “AClass” object: FALSE # alength >= 15, тому генерується помилка
S4-generic функції також мають певні відмінності від їхніх S3 побратимів. Головною відмінністю є можливість визначення сигнатури для generic-функції і для її методів, тобто перевіряється тип не лише першого аргументу, а й решти. При цьому в сигнатурі можна використати спеціальні типи ANY та MISSING, які вказують на те, що аргумент може бути будь-якого типу, або бути обов'язково пропущеним, відповідно.
Оскільки в R функції є об'єктами першого класу (тобто їх можна передавати як аргументи в інші функції та присвоювати змінним), то можна створити клас від типу function:
# визначимо функцію, яка просто збільшує аргумент на 10 і повертає результат
foo <- function(p){
p + 10;
}
# наслідуємо клас від функції
CFun <- setClass("CFun", contains = c("function")
, slots = c(param = "numeric")
)
# визначимо метод generic-функції show для класу CFun
setMethod("show", "CFun",
function(object) {
cat("Show method for CFun objects\n") # виводимо рядок
cat(object(object@param)) # використовуємо CFun-об'єкт як функцію
})
# створимо новий об'єкт класу CFun
> cf.obj <- CFun(foo, param = 13)
# тепер введемо в консолі ім'я створеного об'єкту, щоб подивитись його значення
# при цьому буде знайдено відповідний метод функції show
> cf.obj
Show method for CFun objects
23 # == foo(13) == cf.obj(cf.obj@param)
Важливою особливістю R є тотальне використання того, що називають, recycling:
# Створюємо вектор чисел від 1 до 10
> x <- 1:10
> x
[1] 1 2 3 4 5 6 7 8 9 10
# кожен елемент х порівнюється з 4
# фактично х порівнюється з 10-елементним вектором, що складається лише з 4
# говорять, що 4 була recycled, перероблена
> x > 4
[1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
# додамо 10 до елементів х окрім 4,5 та 6-го
> x[-(4:6)] + 10
[1] 11 12 13 17 18 19 20
# якщо довжина довшого об'єктів не ділиться націло на довжину коротшого, то виводиться попредження
# але операція все одно виконується
> x + c(10, 100, 1000)
[1] 11 102 1003 14 105 1006 17 108 1009 20
Warning message:
In x + c(10, 100, 1000) :
longer object length is not a multiple of shorter object length
Хоча R орієнтована на розв'язок і аналіз статистичних задач, вона може використовуватися для матричних обрахунків з порівняльною швидкодією до математичних пакетів GNU Octave або MATLAB.[13]
Створено багато пакетів для статистичних обчислень, біоінформатики, оптимізації тощо (див. "Пакети/Бібліотеки").
Середовище R містить засоби для візуалізації результатів обчислень (двовимірні, тривимірні графіки, діаграми, гістограми, діаграми (схеми) Ганта тощо). Графічні можливості R дозволяють створювати високоякісні графіки з різними атрибутами, зокрема математичні формули і символи.
Іншою особливістю є функція Sweave яка дозволяє інтеграцію і виконання коду R в документах написаних за допомогою LaTeX з метою створення динамічних звітів[14].
R de-facto став стандартом у міжнародній спільноті спеціалістів в галузі статистики, і широко використовується в розробках статистичних програм та аналізі даних[15]. Згіно щорічному опитуванню Rexer's Annual Data Miner Survey в 2010 році, більшість (43%) серед опитаних спеціалістів з аналізу даних використовують у своїй роботі середовище R[16].
Можливості R значно розширюються додатковими пакетами (бібліотеками). Пакети розробляються безпосередньо користувачами R. Існує понад 4500 пакетів, доступних на сайті Comprehensive R Archive Network (CRAN) [Архівовано 5 січня 2008 у Wayback Machine.], Omegahat , Bioconductor [Архівовано 16 липня 2011 у Wayback Machine.], R-Forge [Архівовано 6 липня 2011 у Wayback Machine.]. [18].
На сторінці "Task View" вебсайту CRAN [Архівовано 20 червня 2010 у Wayback Machine.] розміщено список напрямків (Фінанси, Генетика, Хеміометрія і Математична Фізика, Навколишнє середовище, Суспільні науки) в яких використовується R і для яких доступні пакети на сайті.
Приклади
Основний синтаксис
Наступні приклади ілюструють базовий синтаксис мови та використання інтерфейсу командного рядка. (Розширений список функцій стандартної мови можна знайти в посібнику R, «Вступ до R». )
У R загалом кращим оператором присвоєння є стрілка, яка складається з двох символів <-, хоча в деяких випадках можна використовувати =.
> x <- 1:6 # Create a numeric vector in the current environment
> y <- x^2 # Create vector based on the values in x.
> print(y) # Print the vector’s contents.
[1] 1 4 9 16 25 36
> z <- x + y # Create a new vector that is the sum of x and y
> z # Return the contents of z to the current environment.
[1] 2 6 12 20 30 42
> z_matrix <- matrix(z, nrow=3) # Create a new matrix that turns the vector z into a 3x2 matrix object
> z_matrix
[,1] [,2]
[1,] 2 20
[2,] 6 30
[3,] 12 42
> 2*t(z_matrix)-2 # Transpose the matrix, multiply every element by 2, subtract 2 from each element in the matrix, and return the results to the terminal.
[,1] [,2] [,3]
[1,] 2 10 22
[2,] 38 58 82
> new_df <- data.frame(t(z_matrix), row.names=c('A','B')) # Create a new data.frame object that contains the data from a transposed z_matrix, with row names 'A' and 'B'
> names(new_df) <- c('X','Y','Z') # Set the column names of new_df as X, Y, and Z.
> print(new_df) # Print the current results.
X Y Z
A 2 6 12
B 20 30 42
> new_df$Z # Output the Z column
[1] 12 42
> new_df$Z==new_df['Z'] && new_df[3]==new_df$Z # The data.frame column Z can be accessed using $Z, ['Z'], or [3] syntax, and the values are the same.
[1] TRUE
> attributes(new_df) # Print attributes information about the new_df object
$names
[1] "X" "Y" "Z"
$row.names
[1] "A" "B"
$class
[1] "data.frame"
> attributes(new_df)$row.names <- c('one','two') # Access and then change the row.names attribute; can also be done using rownames()
> new_df
X Y Z
one 2 6 12
two 20 30 42
Структура функції
Однією з сильних сторін R є легкість створення нових функцій. Об'єкти в тілі функції залишаються локальними для функції, і будь-який тип даних може бути повернутий.[126] приклад:
# Declare function “f” with parameters “x”, “y“
# that returns a linear combination of x and y.
f <- function(x, y) {
z <- 3 * x + 4 * y
return(z) ## the return() function is optional here
}
> f(1, 2)
[1] 11
> f(c(1,2,3), c(5,3,4))
[1] 23 18 25
> f(1:3, 4)
[1] 19 22 25
Моделювання та конструювання
Мова R має вбудовану підтримку моделювання даних і графіки. У наступному прикладі показано, як R може легко створити та побудувати лінійну модель із залишками.
Діагностичні графіки з побудови «моделі» (наприклад, функція «plot.lm()»). Зверніть увагу на математичне позначення, дозволене в мітках (нижній лівий графік).
> x <- 1:6 # Create x and y values
> y <- x^2
> model <- lm(y ~ x) # Linear regression model y = A + B * x.
> summary(model) # Display an in-depth summary of the model.
Call:
lm(formula = y ~ x)
Residuals:
1 2 3 4 5 6 7 8 9 10
3.3333 -0.6667 -2.6667 -2.6667 -0.6667 3.3333
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -9.3333 2.8441 -3.282 0.030453 *
x 7.0000 0.7303 9.585 0.000662 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.055 on 4 degrees of freedom
Multiple R-squared: 0.9583, Adjusted R-squared: 0.9478
F-statistic: 91.88 on 1 and 4 DF, p-value: 0.000662
> par(mfrow = c(2, 2)) # Create a 2 by 2 layout for figures.
> plot(model) # Output diagnostic plots of the model.
Набір Мандельброта
Короткий R-код обчислення Мандельброта, набір через перші 20 ітерацій рівняння z = z2 + c, нанесений на графік для різних комплексних констант c. Цей приклад демонструє:
"Mandelbrot.gif" – графіка, створена на R із 14 рядками коду в прикладі 2
використання зовнішніх бібліотек, розроблених спільнотою (так звані пакети), у цьому випадку пакет caTools
робота з комплексними числами
багатовимірні масиви чисел, які використовуються як базовий тип даних, див. змінні C, Z і X.
install.packages("caTools") # install external package
library(caTools) # external package providing write.gif function
jet.colors <- colorRampPalette(c("green", "pink", "#007FFF", "cyan", "#7FFF7F",
"white", "#FF7F00", "red", "#7F0000"))
dx <- 1500 # define width
dy <- 1400 # define height
C <- complex(real = rep(seq(-2.2, 1.0, length.out = dx), each = dy),
imag = rep(seq(-1.2, 1.2, length.out = dy), dx))
C <- matrix(C, dy, dx) # reshape as square matrix of complex numbers
Z <- 0 # initialize Z to zero
X <- array(0, c(dy, dx, 20)) # initialize output 3D array
for (k in 1:20) { # loop with 20 iterations
Z <- Z^2 + C # the central difference equation
X[, , k] <- exp(-abs(Z)) # capture results
}
write.gif(X, "Mandelbrot.gif", col = jet.colors, delay = 100)
Графічна оболонка RGui разом з командною оболонкою (терміналом) R Console входять до базового пакету R у версії для Windows
RStudio — зручне кросплатформне середовище розробки з відкритим кодом (існує можливість запуску на віддаленому linux сервері).
RKWard — розширюване середовище розробки IDE
RapidMiner [Архівовано 22 червня 2011 у Wayback Machine.] і розширення RapidMiner R — середовище розробки для аналізу і обробки даних з використанням R, WEKA
Java Gui for R (JGR) [Архівовано 30 червня 2011 у Wayback Machine.] — кросплатформний термінал і редактор R написаний на Java
Deducer [Архівовано 24 жовтня 2016 у Wayback Machine.] — графічний інтерфейс для аналізів даних з використанням системи меню (подібний до SPSS). Розроблений для використання разом з JGR та RGui.
Rattle GUI [Архівовано 5 липня 2011 у Wayback Machine.] — кросплатформний графічний інтерфейс, розроблений для добування даних (збору та аналізу даних).
R Commander — кросплатформний GUI з системою меню і доступними додатковими плагінами (базується Tcl/Tk)
RExcel — додаток до Microsoft Excel, який дозволяє використовувати можливості R
Sage — середовище для математичних розрахунків з використанням інтерфейсу веббраузера, бібліотек R і підтримкою rpy
Red-R — інтерфейс для аналізу, що використовує R
Tinn-R [Архівовано 11 червня 2011 у Wayback Machine.] — графічний інтерфейс
gedit, Bluefish [Архівовано 5 липня 2011 у Wayback Machine.], IDE Eclipse, Kate,[19] Vim, Emacs (Emacs Speaks Statistics [Архівовано 2 травня 2022 у Wayback Machine.]), Crimson Editor [Архівовано 17 грудня 2017 у Wayback Machine.], ConTEXT [Архівовано 27 червня 2011 у Wayback Machine.], Tinn-R[20], Geany [Архівовано 28 січня 2021 у Wayback Machine.], jEdit, Syn [Архівовано 20 серпня 2011 у Wayback Machine.], TextMate — The Missing Editor for Mac OS X [Архівовано 6 вересня 2008 у Wayback Machine.], SciTE [Архівовано 20 лютого 2011 у Wayback Machine.], WinEdt [Архівовано 26 квітня 2007 у Wayback Machine.] (R Package RWinEdt), WPE, notepad++[21] і SciViews.
R доступна для використання у мовах програмуваннях Python (за допомогою пакета RPy[22]), Perl (за допомогою модуля Statistics::R[23] ) і Ruby (за допомогою RSRuby[24] ).
Деякі пропрієтарні програмні продукти призначені для аналізу статистичних даних (напр. SPSS, STATISTICA[25], SAS[26]) мають розширення, розроблені для інтеграції у свої структури функціоналу R.
Заснована 2007 року компанія Revolution Analytics розпочала комерційну підтримку версії R під назвою ParallelR, розробленої спеціально для кластерів робочих станцій. В 2011 з'явилася можливість зчитувати і записувати дані у формат файлів SAS за допомогою пропієтарного Enterprise R[27].