Rмова програмування і програмне середовище для статистичних обчислень, аналізу та зображення даних в графічному вигляді. Розробка R відбувалась під істотним впливом двох наявних мов програмування: мови програмування S з семантикою, успадкованою від Scheme[6]. R названа за першою літерою імен її засновників Роса Іхаки (Ross Ihaka) та Роберта Джентлмена, (Robert Gentleman)[7] працівників Оклендського Університету в Новій Зеландії. Незважаючи на деякі принципові відмінності, більшість програм, написаних мовою програмування S запускаються в середовищі R.

R
Парадигма функційне програмування, Масивове програмуванняd, об'єктно-орієнтоване програмування[1], імперативне програмування, Рефлексія і процедурне програмування
Дата появи серпень 1993[2]
Творці Ross Ihaka[en] та Robert Gentleman[en]
Розробник R Core Team[3]
Останній реліз 3.6.1 ("Action of the Toes")[4] (5 липня 2019; 4 роки тому (2019-07-05))
Система типізації динамічна
Під впливом від S, Scheme
Мова реалізації C[5], Fortran[5] і R[5]
Операційна система декілька:Linux/Unix, Windows, Mac OS X
Ліцензія GNU General Public License
Репозиторій вихідного коду svn.r-project.org/R/trunk/
Вебсайт www.r-project.org
CMNS: 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 ред.

Приклади[17] ілюструють базовий синтаксис мови програмування R з використанням інтерфейсу командного рядка:

Приклад 1 ред.

Створення числового і символьного векторів

> # Все, що за символом #, інтерпретується як коментар
> x <- c(1,2,3,4,5,6,7,8,9,10)  # Створення числового вектора
> y <- 2^x                      # піднесення числа до степеня х
> y                             # перегляд змісту об'єкта y, аналогічно print(y)      
 [1]    2    4    8   16   32   64  128  256  512 1024
 
> b1 <- c("Kharkiv","Kyiv","Lviv") # символьний вектор
> b1
[1] "Kharkiv" "Kyiv"  "Lviv"
 
Гістограма згенерована за допомогою коду R Приклад 2

Приклад 2 ред.

Генерація випадкових чисел нормального розподілу і побудова гістограми

> x <- rnorm(1000) # генерація 1000 випадкових чисел 
                   # з розподілу Гауса
> histogram <- hist(x, breaks=50, plot=FALSE) # розрахунок гістограми для змінної x,  
                                              # кількість інтервалів 50 
> plot(histogram, col="blue",border="red") # зображення гістограми за допомогою функції plot()

Пакети/Бібліотеки ред.

Можливості 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 і для яких доступні пакети на сайті.

Графічні Редактори Скриптів та IDE ред.

Для роботи з R існує кілька графічних інтерфейсів (GUI) ред.

  • Графічна оболонка 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.] — графічний інтерфейс

Середовища розробки (IDE) ред.

Текстові редактори та середовища розробки (IDE) з частковою підтримкою R ред.

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] ).

Підтримка R пропрієтарними програмними продуктами ред.

Деякі пропрієтарні програмні продукти, призначені для аналізу статистичних даних (напр. SPSS, STATISTICA[25], SAS[26]), мають розширення, розроблені для інтеграції у свої структури функціоналу R.

Заснована 2007 року компанія Revolution Analytics розпочала комерційну підтримку версії R під назвою ParallelR, розробленої спеціально для кластерів робочих станцій. В 2011 з'явилася можливість зчитувати і записувати дані у формат файлів SAS за допомогою пропієтарного Enterprise R[27].

Див. також ред.

Українська література з R ред.

Примітки ред.

  1. https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Objects
  2. Ihaka R. R : Past and Future History
  3. Hornik, Kurt (26 листопада 2015). R FAQ. The Comprehensive R Archive Network. 2.1 What is R?. Архів оригіналу за 9 липня 2011. Процитовано 5 серпня 2018. 
  4. The Comprehensive R Archive Network. Архів оригіналу за 23 січня 2019. Процитовано 5 липня 2019. 
  5. а б в http://librestats.com/2011/08/27/how-much-of-r-is-written-in-r/
  6. Michael J. Crawley (2007). The R Book. John Wiley & Sons. ISBN 978-0-470-51024-7. 
  7. Robert Gentleman's home page. Архів оригіналу за 25 червня 2013. Процитовано 20 липня 2009. 
  8. Free Software Foundation (FSF) Free Software Directory: GNU R. Архів оригіналу за 25 червня 2013. Процитовано 5 липня 2010. 
  9. What is R?. Архів оригіналу за 25 червня 2013. Процитовано 28 квітня 2009. 
  10. Duncan Temple Lang. Calling R from Java. Архів оригіналу за 21 серпня 2010. Процитовано 5 липня 2010. 
  11. W. N. Venables та B. D. Ripley (2002). Modern Applied Statistics with S (вид. четверте). Springer. ISBN 978-0-387-95457-8. 
  12. S4 Classes and Methods. Архів оригіналу за 13 серпня 2013. Процитовано 4 серпня 2013. 
  13. Speed comparison of various number crunching packages (version 2). SciView. Архів оригіналу за 25 червня 2013. Процитовано 3 листопада 2007. 
  14. Leisch F (2002). Sweave, Part I: Mixing R and LaTeX: A short introduction to the Sweave file format and corresponding R functions. R News. 2 (3): 28–31. 
  15. Vance, Ashlee (6 січня 2009). Data Analysts Captivated by R's Power. New York Times. Архів оригіналу за 31 жовтня 2017. Процитовано 28 квітня 2009. «R is also the name of a popular programming language used by a growing number of data analysts inside corporations and academia. It is becoming their lingua franca...» 
  16. Архівована копія. Архів оригіналу за 15 липня 2011. Процитовано 27 червня 2011. 
  17. Віктор Гнатюк (2010). Вступ до R на прикладах. [недоступне посилання з червня 2019]
  18. Robert A. Muenchen. The Popularity of Data Analysis Software. Архів оригіналу за 25 червня 2013. Процитовано 27 червня 2011. 
  19. Syntax Highlighting. Kate Development Team. Архів оригіналу за 7 липня 2008. Процитовано 9 липня 2008. 
  20. Tinn-R Editor - GUI for R Language and Environment. Tinn-R Team. Архів оригіналу за 25 червня 2013. Процитовано 7 листопада 2010. 
  21. NppToR: R in Notepad++. sourceforge.net. Архів оригіналу за 25 червня 2013. Процитовано 11 липня 2010. 
  22. RPy home page. Архів оригіналу за 18 листопада 2019. Процитовано 12 травня 2022. 
  23. Statistics::R page on CPAN. Архів оригіналу за 1 грудня 2011. Процитовано 9 вересня 2011. 
  24. RSRuby rubyforge project. Архів оригіналу за 5 липня 2015. Процитовано 9 вересня 2011. 
  25. Архівована копія. Архів оригіналу за 12 червня 2013. Процитовано 9 вересня 2011. 
  26. Архівована копія. Архів оригіналу за 10 червня 2011. Процитовано 27 червня 2011. 
  27. 'Red Hat for stats' goes toe-to-toe with SAS. Архів оригіналу за 9 жовтня 2011. Процитовано 27 червня 2011. 

Посилання ред.