R (мова програмування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
R
Rlogo.png
Творці: Ross Ihaka та Robert Gentleman
Розробник: R Development Core Team
Останній реліз: 3.1 (10 квітня 2014; 110 днів тому)
Система типізації: динамічна
Під впливом від: S, Scheme
ОС: декілька:Linux/Unix, Windows, Mac OS X
Ліцензія: GNU General Public License
Сторінка інтернет: www.r-project.org

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

R розповсюджуєтся безкоштовно за ліцензією GNU General Public License [3][4] у вигляді вільнодоступого вихідного коду або відкомпільованих бінарних версій більшості операційних систем: Linux, FreeBSD, Microsoft Windows, Mac OS X, Solaris. R використовує текстовий інтерфейс, однак існують різні графічні інтерфейси користувача (див. Графічні Редактори Скриптів та IDE).

R має значні можливості для здійснення статистичних аналізів, включаючи лінійну і нелінійну регресію, класичні статистичні тести, аналіз часових рядів (серій), кластерний аналіз і багато іншого. R легко розбудовується завдяки використанню додаткових функцій і пакетів доступних на сайті Comprehensive R Archive Network (CRAN). Більша частина стандартних функцій R, написана мовою R, однак існує можливість підключати код написаний C, C++, або Фортраном. Також за допомогою програмного коду на C або Java [5] можна безпосередньо маніпулювати R об'єктами.

Особливості[ред.ред. код]

R належить до інтерпретованих мов програмування і для роботи використовується командний інтерпретатор. Наприклад робота R в терміналі виглядає наступним чином:

 > 1+1
 [1] 2

R підтримує концепцію Об'єктно-орієнтованого програмування (ООП) включаючи generic функції, результат виконання якої залежить від аргументів (типу об'єктів), що передаються generic функції. В мові програмування R всі змінні є об'єктами, кожен об'єкт належить до певного класу.[6] При цьому R має дві класові моделі: S3 та S4. Перша була реалізована від початку існування R, друга була додана у версії 1.7.0 [7] з пакетом methods. 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.[8]

Створено багато пакетів для статистичних обчислень, біоінформатики, оптимізації тощо (див. "Пакети/Бібліотеки").

Середовище R містить засоби для візуалізації результатів обчислень (двовимірні, тривимірні графіки, діаграми, гістограми, діаграми (схеми) Ганта тощо). Графічні можливості R дозволяють створювати високоякісні графіки з різними атрибутами, зокрема математичні формули і символи.

Іншою особливістю є функція Sweave яка дозволяє інтеграцію і виконання коду R в документах написаних за допомогою LaTeX з метою створення динамічних звітів[9].

R de-facto став стандартом у міжнародній спільноті спеціалістів в галузі статистики, і широко використовується в розробках статистичних програм та аналізі даних[10]. Згіно щорічному опитуванню Rexer's Annual Data Miner Survey в 2010 році, більшість (43%) серед опитаних спеціалістів з аналізу даних використовують у своїй роботі середовище R[11].

Приклади коду R[ред.ред. код]

Приклади[12] ілюструють базовий синтакс мови програмування 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), Omegahat , Bioconductor, R-Forge. [13].

На сторінці "Task View" вебсайту CRAN розміщено список напрямків (Фінанси, Генетика, Хеміометрія і Математична Фізика, Навколишнє середовище, Суспільні науки) в яких використовується R і для яких доступні пакети на сайті.

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

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

  • Графічна оболонка RGui разом з командною оболонкою (терміналом) R Console входять до базового пакету R у версії для Windows
  • RStudio — зручне кросплатформне середовище розробки з відкритим кодом (існує можливість запуску на віддаленому linux сервері).
  • RKward — розширюване середовище розробки IDE
  • RapidMiner і розширення RapidMiner R — середовище розробки для аналізу і обробки даних з використанням R, WEKA
  • Java Gui for R (JGR) — кросплатформний термінал і редактор R написаний на Java
  • Deducer — графічний інтерфейс для аналізів даних з використанням системи меню (подібний до SPSS). Розроблений для використання разом з JGR та RGui.
  • Rattle GUI — кросплатформний графічний інтерфейс, розроблений для [en.wikipedia.org/wiki/Data_mining датамайнінгу] (збору і аналізу даних).
  • R Commander — кросплатформний GUI з системою меню і доступними додатковими плагінами (базується Tcl/Tk)
  • RExcel — додаток до Microsoft Excel, який дозволяє використовувати можливості R
  • Sage — середовище для математичних розрахунків з використанням інтерфесу веб-браузера, бібліотек R і підтримкою rpy
  • Red-R — інтерфейс для аналізу, що використовує R
  • Tinn-R — графічний інтерфейс

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

gedit, Bluefish, IDE Eclipse, Kate,[14] Vim, Emacs (Emacs Speaks Statistics ), Crimson Editor, ConTEXT, Tinn-R[15], Geany, jEdit, Syn, TextMate — The Missing Editor for Mac OS X, SciTE, WinEdt (R Package RWinEdt), WPE, notepad++[16] і SciViews.

Взаємодія з іншими мовами програмування[ред.ред. код]

R доступна для використання у мовах програмуваннях Python (за допомогою пакета RPy[17]), Perl (за допомогою модуля Statistics::R[18] ) і Ruby (за допомогою RSRuby[19] ).

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

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

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

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

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

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

  1. Michael J. Crawley (2007). The R Book. John Wiley & Sons. ISBN 978-0-470-51024-7. 
  2. «Robert Gentleman's home page». Архів оригіналу за 2013-06-25. Процитовано 2009-07-20. 
  3. «Free Software Foundation (FSF) Free Software Directory: GNU R». Архів оригіналу за 2013-06-25. Процитовано 2010-07-05. 
  4. «What is R?». Архів оригіналу за 2013-06-25. Процитовано 2009-04-28. 
  5. Duncan Temple Lang, Calling R from Java, http://www.omegahat.org/RSJava/RFromJava.pdf, процитовано 2010-07-05 
  6. W. N. Venables та B. D. Ripley (2002). Modern Applied Statistics with S (вид. четверте). Springer. ISBN 978-0-387-95457-8. 
  7. http://www.webcitation.org/6IqKWudXC. Архів оригіналу за 2013-08-13.  Пропущений або порожній |title= (довідка)
  8. «Speed comparison of various number crunching packages (version 2)». SciView. Архів оригіналу за 2013-06-25. Процитовано 2007-11-03. 
  9. Leisch F Sweave, Part I: Mixing R and LaTeX: A short introduction to the Sweave file format and corresponding R functions // R News, 2 (2002) (3) С. 28–31.
  10. Vance, Ashlee (2009-01-06). «Data Analysts Captivated by R's Power». New York Times. Процитовано 2009-04-28. «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...» 
  11. http://www.rexeranalytics.com/Data-Miner-Survey-Results-2010.html
  12. Віктор Гнатюк (2010). Вступ до R на прикладах. 
  13. Robert A. Muenchen. «The Popularity of Data Analysis Software». Архів оригіналу за 2013-06-25. 
  14. «Syntax Highlighting». Kate Development Team. Архів оригіналу за 2008-07-07. Процитовано 2008-07-09. 
  15. «Tinn-R Editor - GUI for R Language and Environment». Tinn-R Team. Архів оригіналу за 2013-06-25. Процитовано 2010-11-07. 
  16. «NppToR: R in Notepad++». sourceforge.net. Архів оригіналу за 2013-06-25. Процитовано 2010-07-11. 
  17. RPy home page
  18. Statistics::R page on CPAN
  19. RSRuby rubyforge project
  20. http://www.statsoft.com/solutions/r-language-platform/
  21. http://www.sas.com/news/preleases/RintegrationSGF09.html
  22. 'Red Hat for stats' goes toe-to-toe with SAS

Ресурси інтернету[ред.ред. код]