R語言
編程範型 | 多重編程範式:陣列式、物件導向、函數式、反射式、指令式、[1]程序式[2] |
---|---|
設計者 | 羅斯·伊哈卡和羅伯特·傑特曼 |
實作者 | R核心開發小組 |
釋出時間 | 1993年8月 |
目前版本 |
|
型態系統 | 動態型別[4] |
副檔名 | |
網站 | www |
啟發語言 | |
S、Scheme、Lisp | |
影響語言 | |
Julia[7] | |
|
R語言是一種自由軟件程式語言與操作環境,主要用於統計分析、繪圖以及數據探勘。R由新西蘭奧克蘭大學的統計學家羅斯·伊哈卡和羅伯特·傑特曼開發,現在由R核心小組負責開發,同時也有其他用戶編寫了諸多外掛的軟件套件。R以S語言為基礎,其詞法作用域語意來自Scheme。R的後台程式大多由C語言、FORTRAN語言和R自己寫成。[8]
R語言是GNU計劃的一個專案,所以其原始碼可自由下載使用。R也有已編譯的執行檔版本可以下載,可在多種平台下執行,包括UNIX(也包括FreeBSD和Linux)、Windows和MacOS。[8]R可以以命令列操作,[8]同時有人開發了幾種圖形用戶介面,其中包括RStudio[8]與Jupyter。[9]
在TIOBE2022年1月對程式語言人氣的排名中,R排名第12。[10]
發展歷程
[編輯]R語言以S語言為基礎,增加了Scheme語言中詞法作用域這一機制,使程式設計師得以將代碼中某一對象的適用範圍限制到一小段代碼之中。[1]S由里克·貝克爾、約翰·錢伯斯、道格·鄧恩、瓊·麥克雷、以及朱迪·席林於1976年前後於貝爾實驗室發明。[11]S是一種用於數據分析的直譯語言,無需編譯器即可執行。通常用S語言編寫的代碼都可以不作修改地在R環境下執行。[12]Scheme是Lisp語言的一個分支,[13]由傑拉爾德·J·薩斯曼和小蓋伊·L·斯蒂爾於1975年前後在麻省理工學院發明。[14]
1991年,新西蘭奧克蘭大學的統計學家羅斯·伊哈卡和羅伯特·傑特曼開始對S語言的一個新版本進行開發。[15]伊哈卡與傑特曼兩人名字首字母都是R,R語言因此得名。同時,R這個單一字母的名字也表明R語言與S語言一脈相承。[8]1993年8月,伊哈卡與傑特曼在數據平台StatLib和郵寄清單s-news中釋出了R的早期版本。1995年,在統計學家馬丁·梅克勒的建議下,伊哈卡與傑特曼通過GNU通用公眾特許條款把R做成了一款免費開源軟件。軟件於1995年6月進行了首次官方釋出。[16]首個穩定測試版本(1.0)於2000年2月29日釋出。[17]
R綜合檔案網(Comprehensive R Archive Network;CRAN)於1997年4月23日正式上線。CRAN除了收藏了R的執行檔下載版、原始碼和說明文件,也收錄了各種用戶撰寫的R軟件包。CRAN最早有3個鏡像以及12個軟件套件。[18]截止2022年1月,CRAN有101個鏡像站[19]以及18728個軟件套件。[20]
同樣在1997年,R核心小組正式成立,以進一步對R語言進行開發。截止2022年1月,小組成員包括伊哈卡、傑特曼、錢伯斯以及梅克勒,同時也包括了統計學家庫爾特·奧爾尼克、道格拉斯·貝茨、彼得·達爾高、盧克·蒂爾尼、弗里德里希·萊施、托馬斯·拉姆利、鄧肯·坦普爾·朗、米高·勞倫斯、烏韋·利格斯、布萊恩·里普利、塞巴斯蒂安·邁耶、保羅·默雷爾、馬丁·普盧默、迪伊潘·薩卡爾、西蒙·烏爾巴內克以及電腦科學家托馬斯·卡利貝拉。[8]小組過去的成員包括塞思·福爾肯、圭多·馬薩羅托、鄧肯·默多克、馬丁·摩根、海納·施瓦特以及斯特凡諾·雅各斯。[21]2003年4月[22],一個名為R基金會的非盈利組織正式成立,為的是更好地對R語言的開發提供支援。[8]
內建功能
[編輯]R主要用於數據分析。在R語言中,用於資訊儲存的數據結構包括向量、陣列、列表以及數據框。向量指一組帶有固定順序, 資料類型唯一的字串或數值,其內容可以填寫到一維或多維的陣列之中。二維陣列也叫做矩陣。[23]R支援各種陣列運算,與自由軟件GNU Octave和商業軟件MATLAB的功能有所重疊。[24][25]列表指一組資料類型可能有所不同的對象。一個字串向量與數值向量合在一起就可以成為一個列表。數據框本質上是一個列表,裡面包含了一個或多個長度相同的向量。數據框將這些向量合併成表格,每一縱列都有一個單一的名稱。[23]純量這一資料類型在R語言中並不存在,所謂的純量就是一個長度為一的向量。[26]
用戶可以用R來進行一些基本的統計檢驗,構建線性及非線性的模型,對時間序列加以分析,或對數據進行分類與聚類分析。R的另一強項是繪圖功能,畫出的圖表能夠達到專業出版物的要求,也可加入數學符號。計算強度較大時,用戶可在程式中嵌入C、C++以及FORTRAN語言以幫助運算。[27]
因為S的血緣,R比其他統計學或數學專用的程式語言有更強的物件導向(物件導向程式設計, S3, S4等)功能。
套件
[編輯]R的功能能夠透過由用戶撰寫的套件(Packages)增強。增加的功能有特殊的統計技術、繪圖功能,以及編程介面和數據輸出/輸入功能。這些軟件包是由R語言、LaTeX、Java及最常用C語言和Fortran撰寫。下載的執行檔版本會連同一批核心功能的軟件包,而根據CRAN紀錄有一萬多種不同的軟件包。其中有幾款較為常用,例如用於經濟計量、財經分析、人文科學與社會科學研究以及人工智能。[28]
發展
[編輯]生物資訊科學社群時常使用R進行分子生物學數據分析。Bioconductor計劃就是讓R作為基因圖譜分析工具。 Gnumeric開發者正和R開發者合作,改善Gnumeric計算結果的精確度。[29]
R新聞雜誌
[編輯]《R新聞雜誌》(R Newsletter)每年會出版兩至三次,為一份免費的電子雜誌,內容有關統計學軟件發展及R語言開發資訊。第一期在2001年一月出版。從2008年開始,被R Journal替代。[30]
例子
[編輯]基本語法
[編輯]下面的例子展示基本的語言語法和命令列介面使用。在R語言中,一般偏好採用兩字元合成箭頭的賦值算符<-
,但是在某些情況也可以使用=
[31][32]。
> x <- 1:6 # 在当前环境中创建数值向量。
> y <- x^2 # 基于在x中的值创建向量。
> print(y) # 打印向量的内容。
[1] 1 4 9 16 25 36
> z <- x + y # 创建是为x与y的和的新向量。
> z # 返回z的内容至当前环境。
[1] 2 6 12 20 30 42
> z_matrix <- matrix(z, nrow=3) # 创建将向量z转变为3x2矩阵对象的新矩阵。
> z_matrix
[,1] [,2]
[1,] 2 20
[2,] 6 30
[3,] 12 42
> 2*t(z_matrix)-2 # 转置这个矩阵,对每个元素乘以2,从矩阵中每个元素减去2,并返回结果至终端。
[,1] [,2] [,3]
[1,] 2 10 22
[2,] 38 58 82
> new_df <- data.frame(t(z_matrix), row.names=c('A','B')) # 创建包含来自转置的z_matrix的数据的新data.frame对象,具有横行名字'A'和'B'。
> names(new_df) <- c('X','Y','Z') # 设置new_df的纵列名字为X、Y和Z。
> print(new_df) # 打印当前结果。
X Y Z
A 2 6 12
B 20 30 42
> new_df$Z # 输出Z列。
[1] 12 42
> new_df$Z==new_df['Z'] && new_df[3]==new_df$Z # data.frame的Z列可以使用$Z、['Z']或[3]语法来访问,得到的值是相同的。
[1] TRUE
> attributes(new_df) # 打印关于new_df对象的特性信息。
$names
[1] "X" "Y" "Z"
$row.names
[1] "A" "B"
$class
[1] "data.frame"
> attributes(new_df)$row.names <- c('one','two') # 访问并接着变更row.names特性;还可以使用rownames()来完成。
> new_df
X Y Z
one 2 6 12
two 20 30 42
函數的結構
[編輯]R語言的力量之一是易於新增函數。在函數體內的對象保持局部於這個函數,而且可以返回任何資料類型[33]。例如:
# 声明函数“f”具有参数“x”、“y“。
# 它返回x和y的线性组合。
f <- function(x, y) {
z <- 3 * x + 4 * y
return(z) ## 这里的return()函数是可选的。
}
> 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語言如何輕易的生成並繪製帶有殘差的線性回歸模型。
> x <- 1:6 # 创建x和y值。
> y <- x^2
> model <- lm(y ~ x) # 线性回归模型y = A + B * x。
> summary(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)) # 创建2乘2格局的图表。
> plot(model) # 输出这个模型的诊断图。
曼德博集合
[編輯]通過對方程z = z2 + c的前20次迭代計算曼德博集合的簡短R代碼,它針對不同的複數常數c而繪圖。這個例子展示了:
install.packages("caTools") # 安装外部包。
library(caTools) # 这个外部包提供write.gif函数。
jet.colors <- colorRampPalette(c("green", "pink", "#007FFF", "cyan", "#7FFF7F",
"white", "#FF7F00", "red", "#7F0000"))
dx <- 1500 # 定义宽度。
dy <- 1400 # 定义高度。
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) # 重制形状为复数的方块矩阵。
Z <- 0 # 初始化Z为零。
X <- array(0, c(dy, dx, 20)) # 初始化输出3D数组。
for (k in 1:20) { # 循环具有20次迭代。
Z <- Z^2 + C # 中心差分方程。
X[, , k] <- exp(-abs(Z)) # 捕获结果。
}
write.gif(X, "Mandelbrot.gif", col = jet.colors, delay = 100)
參考文獻
[編輯]- ^ 1.0 1.1 Morandat, Floréal; Hill, Brandon; Osvald, Leo; Vitek, Jan. Noble, James , 編. Evaluating the Design of the R Language. ECOOP 2012 – Object-Oriented Programming. Lecture Notes in Computer Science (Berlin, Heidelberg: Springer). 2012: 104–131 [2021-07-18]. ISBN 978-3-642-31057-7. doi:10.1007/978-3-642-31057-7_6. (原始內容存檔於2021-07-18) (英語).
- ^ White, Homer. Programming Paradigms. Beginning Computer Science with R. 2021-01-31 [2021-07-18]. (原始內容存檔於2021-07-18) (美國英語).
- ^ 3.0 3.1 彼得·達爾高. 4.4.2 is released. 2024年10月31日 [2024年11月1日] (英語).
- ^ jmount. Why I don’t like Dynamic Typing. Win Vector LLC. 2012-02-25 [2021-07-18]. (原始內容存檔於2021-07-17) (美國英語).
- ^ R scripts. mercury.webster.edu. [2021-07-17]. (原始內容存檔於2022-01-15).
- ^ R Data Format Family (.rdata, .rda). www.loc.gov. 2017-06-09 [2021-07-18]. (原始內容存檔於2021-07-17).
- ^ Introduction. The Julia Manual. [2018-08-05]. (原始內容存檔於20 June 2018).
- ^ 8.0 8.1 8.2 8.3 8.4 8.5 8.6 R FAQ. cran.r-project.org. [2021-07-18]. (原始內容存檔於2011-07-09).
- ^ Using the R programming language in Jupyter Notebook — Anaconda documentation. docs.anaconda.com. [2021-12-29]. (原始內容存檔於2022-04-26).
- ^ index | TIOBE - The Software Quality Company. www.tiobe.com. [2021-07-18]. (原始內容存檔於2018-02-25).
- ^ Becker, Richard A. A Brief History of S. [2022-01-03]. (原始內容存檔於2022-01-03).
- ^ R: What is R?. www.r-project.org. [2021-07-18]. (原始內容存檔於2011-07-19).
- ^ John M. Chambers. S, R, and Data Science. The R Journal. 2020, 11 (1): 462-476.
- ^ Sussman, Gerald Jay; Steele, Guy L. The First Report on Scheme Revisited. Higher-Order and Symbolic Computation. 1998-12-01, 11 (4): 399–404 [2022-01-03]. ISSN 1573-0557. doi:10.1023/A:1010079421970. (原始內容存檔於2023-09-15) (英語).
- ^ Academic unfazed by rock star status. NZ Herald. [2022-01-03]. (原始內容存檔於2022-04-11) (New Zealand English).
- ^ R : Past and Future History -- A Free Software Project. cran.r-project.org. [2022-01-03]. (原始內容存檔於2017-07-11).
- ^ Ross Ihaka. The R Project: A Brief History and Thoughts About the Future (PDF). Ross Ihaka. [2022-01-03]. (原始內容 (pdf)存檔於2018-02-02) (英語).
- ^ ANNOUNCE: CRAN. stat.ethz.ch. [2022-01-03]. (原始內容存檔於2021-03-08).
- ^ CRAN - Mirrors. cran.r-project.org. [2022-01-15]. (原始內容存檔於2022-05-10).
- ^ CRAN - Contributed Packages. cran.r-project.org. [2022-01-03]. (原始內容存檔於2022-04-11).
- ^ R: Contributors. www.r-project.org. [2022-01-03]. (原始內容存檔於2022-04-23).
- ^ Martin Mächler. Kurt Hornik. R Foundation News (PDF). The R Journal. 2014, 6 (2): 190-191 [2022-01-03]. (原始內容 (PDF)存檔於2022-01-20).
- ^ 23.0 23.1 Dalgaard, Peter. Basics. Dalgaard, Peter (編). Introductory Statistics with R. Statistics and Computing. New York, NY: Springer. 2008: 1–29. ISBN 978-0-387-79054-1. doi:10.1007/978-0-387-79054-1_1 (英語).
- ^ 存档副本. [2007-11-03]. (原始內容存檔於2009-08-08).
- ^ Han-feng Chen, Wai-Mee Ching, and Da Zheng. A Comparison Study on Execution Performance of MATLAB and APL (PDF). McGill University. [March 9, 2022]. (原始內容 (PDF)存檔於2022-03-03) (英語).
- ^ Data structures · Advanced R.. adv-r.had.co.nz. [2022-03-09]. (原始內容存檔於2016-09-20).
- ^ R: What is R?. www.r-project.org. [2022-03-09]. (原始內容存檔於2011-07-19).
- ^ 存档副本. [2007-06-04]. (原始內容存檔於2007-06-25).
- ^ Gnumeric, Team. Gnumeric 1.4 is Here!. The GNOME Project. 2004年12月19日 [2006-04-30]. (原始內容存檔於2006年10月5日).
- ^ 存档副本. [2007-06-04]. (原始內容存檔於2007-05-28).
- ^ R Development Core Team. Assignments with the = Operator. [2018-09-11]. (原始內容存檔於2019-01-08).
- ^ most used assignment operator in R is
<-
- R Development Core Team. Writing R Extensions. [2018-09-11]. (原始內容存檔於2019-01-06).
[...] we recommend the consistent use of the preferred assignment operator 『<-』 (rather than 『=』) for assignment.
- Google's R Style Guide. [2018-09-11]. (原始內容存檔於2019-01-11).
- Wickham, Hadley. Style Guide. [2018-09-11]. (原始內容存檔於2019-01-07).
- Bengtsson, Henrik. R Coding Conventions (RCC) – a draft. January 2009 [2018-09-11]. (原始內容存檔於2016-03-19).
- R Development Core Team. Writing R Extensions. [2018-09-11]. (原始內容存檔於2019-01-06).
- ^ Kabacoff, Robert. Quick-R: User-Defined Functions. statmethods.net. 2012 [2018-09-28]. (原始內容存檔於2019-01-07).