R (programming language)

R is a programming language for statistical computing and data visualization. It has been adopted in the fields of data mining, bioinformatics, and data analysis.[8]

R
R terminal
ParadigmsMulti-paradigm: procedural, object-oriented, functional, reflective, imperative, array[1]
Designed byRoss Ihaka and Robert Gentleman
DeveloperR Core Team
First appearedAugust 1993; 30 years ago (1993-08)
Stable release
4.3.3[2] Edit this on Wikidata / 29 February 2024; 59 days ago (29 February 2024)
Typing disciplineDynamic
Platformarm64 and x86-64
LicenseGNU GPL v2[3]
Filename extensions
  • .r[4]
  • .rdata
  • .rhistory
  • .rds
  • .rda[5]
Websitewww.r-project.org Edit this at Wikidata
Influenced by
Influenced
Julia[7]

The core R language is augmented by a large number of extension packages, containing reusable code, documentation, and sample data.

R software is open-source and free software. It is licensed by the GNU Project and available under the GNU General Public License.[3] It is written primarily in C, Fortran, and R itself. Precompiled executables are provided for various operating systems.

As an interpreted language, R has a native command line interface. Moreover, multiple third-party graphical user interfaces are available, such as RStudio—an integrated development environment—and Jupyter—a notebook interface.

History

Ross Ihaka, co-originator of R

R was started by professors Ross Ihaka and Robert Gentleman as a programming language to teach introductory statistics at the University of Auckland.[9] The language was inspired by the S programming language, with most S programs able to run unaltered in R.[6] The language was also inspired by Scheme's lexical scoping, allowing for local variables.[1]

The name of the language, R, comes from being both an S language successor as well as the shared first letter of the authors, Ross and Robert.[10] In August 1993, Ihaka and Gentleman posted a binary of R on StatLib — a data archive website. At the same time, they announced the posting on the s-news mailing list.[11] On December 5, 1997, R became a GNU project when version 0.60 was released.[12] On February 29, 2000, the first official 1.0 version was released.[13]

Packages

Violin plot created from the R visualization package ggplot2

R packages are collections of functions, documentation, and data that expand R.[14] For example, packages add report features such as RMarkdown, knitr and Sweave. Easy package installation and use have contributed to the language's adoption in data science.[15]

The Comprehensive R Archive Network (CRAN) was founded in 1997 by Kurt Hornik and Fritz Leisch to host R's source code, executable files, documentation, and user-created packages.[16] Its name and scope mimic the Comprehensive TeX Archive Network and the Comprehensive Perl Archive Network.[16] CRAN originally had three mirrors and 12 contributed packages.[17] As of December 2022, it has 103 mirrors[18] and 18,976 contributed packages.[19] Packages are also available on repositories R-Forge, Omegahat, and GitHub.

The Task Views on the CRAN website lists packages in fields such as finance, genetics, high-performance computing, machine learning, medical imaging, meta-analysis, social sciences, and spatial statistics.

The Bioconductor project provides packages for genomic data analysis, complementary DNA, microarray, and high-throughput sequencing methods.

Packages add the capability to implement various statistical techniques such as linear, generalized linear and nonlinear[disambiguation needed] modeling, classical statistical tests, spatial analysis, time-series analysis, and clustering.

An example package is the tidyverse package. Its focus is having a common interface around accessing and processing data contained in the data frame data structure, a two-dimensional table of rows and columns. Each function in the package is designed to couple together all the other functions in the package.[20]

Installing a package occurs only once. To install tidyverse:[20]

> install.packages( "tidyverse" )

To instantiate the functions, data, and documentation of a package, execute the library() function. To instantiate tidyverse:[a]

> library( tidyverse )

Interfaces

R comes installed with a command line console. Available for installation are various integrated development environments (IDE). IDEs for R include R.app (OSX/macOS only), Rattle GUI, R Commander, RKWard, RStudio, and Tinn-R.

General purpose IDEs that support R include Eclipse via the StatET plugin and Visual Studio via R Tools for Visual Studio.

Editors that support R include Emacs, Vim via the Nvim-R plugin, Kate, LyX via Sweave, WinEdt (website), and Jupyter (website).

Scripting languages that support R include Python (website), Perl (website), Ruby (source code), F# (website), and Julia (source code).

General purpose programming languages that support R include Java via the Rserve socket server, and .NET C# (website).

Statistical frameworks which use R in the background include Jamovi and JASP.

Community

The R Core Team was founded in 1997 to maintain the R source code. The R Foundation for Statistical Computing was founded in April 2003 to provide financial support. The R Consortium is a Linux Foundation project to develop R infrastructure.

The R Journal is an open access, academic journal which features short to medium-length articles on the use and development of R. It includes articles on packages, programming tips, CRAN news, and foundation news.

The R community hosts many conferences and in-person meetups. These groups include:

Implementations

The main R implementation is written primarily in C, Fortran, and R itself. Other implementations include:

Microsoft R Open (MRO) was an R implementation. As of 30 June 2021, Microsoft started to phase out MRO in favor of the CRAN distribution.[23]

Commercial support

Although R is an open-source project, some companies provide commercial support:

  • Revolution Analytics provides commercial support for Revolution R.
  • Oracle provides commercial support for the Big Data Appliance, which integrates R into its other products.
  • IBM provides commercial support for in-Hadoop execution of R.

Examples

Basic syntax

The following examples illustrate the basic syntax of the language and use of the command-line interface. (An expanded list of standard language features can be found in the R manual, "An Introduction to R".[24])

In R, the generally preferred assignment operator is an arrow made from two characters <-, although = can be used in some cases.[25]

> 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  ZA  2  6 12B 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  Zone  2  6 12two 20 30 42

Structure of a function

One of R's strengths is the ease of creating new functions.[26] Objects in the function body remain local to the function, and any data type may be returned. In R, almost all functions and all user-defined functions are closures.[27]

Create a function:

# The input parameters are x and y.# The function returns a linear combination of x and y.f <- function(x, y) {  z <- 3 * x + 4 * y  # this return() statement is optional  return(z)}

Usage output:

> 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

It is possible to define functions to be used as infix operators with the special syntax `%name%` where "name" is the function variable name:

> `%sumx2y2%` <- function(e1, e2) {e1 ^ 2 + e2 ^ 2}> 1:3 %sumx2y2% -(1:3)[1]  2  8 18

Since version 4.1.0 functions can be written in a short notation, which is useful for passing anonymous functions to higher-order functions:[28]

> sapply(1:5, \(i) i^2)    # here \(i) is the same as function(i) [1]  1  4  9 16 25

Native pipe operator

In R version 4.1.0, a native pipe operator, |>, was introduced.[29] This operator allows users to chain functions together one after another, instead of a nested function call.

> nrow(subset(mtcars, cyl == 4)) # Nested without the pipe character[1] 11> mtcars |> subset(cyl == 4) |> nrow() # Using the pipe character[1] 11

Another alternative to nested functions, in contrast to using the pipe character, is using intermediate objects. However, some argue that using the pipe operator will produce code that is easier to read.[20]

> mtcars_subset_rows <- subset(mtcars, cyl == 4)> num_mtcars_subset <- nrow(mtcars_subset_rows)> print(num_mtcars_subset)[1] 11

Object-oriented programming

The R language has native support for object-oriented programming. There are two native frameworks, the so-called S3 and S4 systems. The former, being more informal, supports single dispatch on the first argument and objects are assigned to a class by just setting a "class" attribute in each object. The latter is a system of formal classes and generic methods that supports multiple dispatch and multiple inheritance[30]

In the example, summary is a generic function that dispatches to different methods depending on whether its argument is a numeric vector or a “factor”:

data <- c("a", "b", "c", "a", NA)summary(data)#>    Length     Class      Mode #>         5 character charactersummary(as.factor(data))#>    a    b    c NA's #>    2    1    1    1

Modeling and plotting

Diagnostic plots from plotting “model” (q.v. “plot.lm()” function). Notice the mathematical notation allowed in labels (lower left plot).

The R language has built-in support for data modeling and graphics. The following example shows how R can generate and plot a linear model with residuals.

# Create x and y valuesx <- 1:6y <- x^2# Linear regression model y = A + B * xmodel <- lm(y ~ x)# Display an in-depth summary of the modelsummary(model)# Create a 2 by 2 layout for figurespar(mfrow = c(2, 2))# Output diagnostic plots of the modelplot(model)

Output:

Residuals:      1       2       3       4       5       6       7       8      9      10 3.3333 -0.6667 -2.6667 -2.6667 -0.6667  3.3333Coefficients:            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 ‘ ’ 1Residual standard error: 3.055 on 4 degrees of freedomMultiple R-squared:  0.9583, Adjusted R-squared:  0.9478F-statistic: 91.88 on 1 and 4 DF,  p-value: 0.000662

Mandelbrot set

"Mandelbrot.gif" graphic created in R

This Mandelbrot set example highlights the use of complex numbers. It models the first 20 iterations of the equation z = z2 + c, where c represents different complex constants.

Install the package that provides the write.gif() function beforehand:

install.packages("caTools")

R Source code:

library(caTools)jet.colors <-    colorRampPalette(        c("green", "pink", "#007FFF", "cyan", "#7FFF7F",          "white", "#FF7F00", "red", "#7F0000"))dx <- 1500 # define widthdy <- 1400 # define heightC  <-    complex(            real = rep(seq(-2.2, 1.0, length.out = dx), each = dy),            imag = rep(seq(-1.2, 1.2, length.out = dy), times = dx)            )# reshape as matrix of complex numbersC <- matrix(C, dy, dx)# initialize output 3D arrayX <- array(0, c(dy, dx, 20))Z <- 0# loop with 20 iterationsfor (k in 1:20) {  # the central difference equation  Z <- Z^2 + C  # capture the results  X[, , k] <- exp(-abs(Z))}write.gif(    X,    "Mandelbrot.gif",    col = jet.colors,    delay = 100)

Version names

All R version releases from 2.14.0 onward have codenames that make reference to Peanuts comics and films.[31][32][33]

In 2018, core R developer Peter Dalgaard presented a history of R releases since 1997.[34] Some notable early releases before the named releases include:

  • Version 1.0.0 released on February 2, 2000 (2000-02-29), a leap day
  • Version 2.0.0 released on October 4, 2004 (2004-10-04), "which at least had a nice ring to it"[34]

The idea of naming R version releases was inspired by the Debian and Ubuntu version naming system. Dalgaard also noted that another reason for the use of Peanuts references for R codenames is because, "everyone in statistics is a P-nut".[34]

R release codenames
VersionRelease dateNamePeanuts referenceReference
4.4.02024-04-24Puppy Cup[35][36]
4.3.32024-02-29Angel Food Cake[37][38]
4.3.22023-10-31Eye Holes[39][40]
4.3.12023-06-16Beagle Scouts[41][42]
4.3.02023-04-21Already Tomorrow[43][44][45][46]
4.2.32023-03-15Shortstop Beagle[47][48]
4.2.22022-10-31Innocent and Trusting[49][50]
4.2.12022-06-23Funny-Looking Kid[51][52][53][54][55][56][57]
4.2.02022-04-22Vigorous Calisthenics[58][59]
4.1.32022-03-10One Push-Up[58][60]
4.1.22021-11-01Bird Hippie[61][62][60]
4.1.12021-08-10Kick Things[63][64]
4.1.02021-05-18Camp Pontanezen[65][66]
4.0.52021-03-31Shake and Throw[67][68]
4.0.42021-02-15Lost Library Book[69][70][71][72]
4.0.32020-10-10Bunny-Wunnies Freak Out[73][74]
4.0.22020-06-22Taking Off Again[75][76]
4.0.12020-06-06See Things Now[77][78]
4.0.02020-04-24Arbor Day[79][80]
3.6.32020-02-29Holding the Windsock[81][82]
3.6.22019-12-12Dark and Stormy NightSee It was a dark and stormy night#Literature and [83][84]
3.6.12019-07-05Action of the Toes[85][86]
3.6.02019-04-26Planting of a Tree[87][88]
3.5.32019-03-11Great Truth[89][90]
3.5.22018-12-20Eggshell Igloos[91][92]
3.5.12018-07-02Feather Spray[93][94]
3.5.02018-04-23Joy in Playing[95][96]
3.4.42018-03-15Someone to Lean On[97][better source needed][98]
3.4.32017-11-30Kite-Eating TreeSee Kite-Eating Tree and [99][100]
3.4.22017-09-28Short SummerSee It Was a Short Summer, Charlie Brown[101]
3.4.12017-06-30Single Candle[102][103]
3.4.02017-04-21You Stupid Darkness[102][104]
3.3.32017-03-06Another Canoe[105][106]
3.3.22016-10-31Sincere Pumpkin Patch[107][108]
3.3.12016-06-21Bug in Your Hair[109][110]
3.3.02016-05-03Supposedly Educational[111][112]
3.2.52016-04-11Very, Very Secure Dishes[113][114][115][116]
3.2.42016-03-11Very Secure Dishes[113][117]
3.2.32015-12-10Wooden Christmas-TreeSee A Charlie Brown Christmas and [118][119]
3.2.22015-08-14Fire Safety[120][121][122]
3.2.12015-06-18World-Famous Astronaut[123][124]
3.2.02015-04-16Full of Ingredients[125][126]
3.1.32015-03-09Smooth Sidewalk[127][page needed][128]
3.1.22014-10-31Pumpkin HelmetSee You're a Good Sport, Charlie Brown[129]
3.1.12014-07-10Sock it to Me[130][131][132][133][134]
3.1.02014-04-10Spring Dance[85][135]
3.0.32014-03-06Warm Puppy[136][137]
3.0.22013-09-25Frisbee Sailing[138][139]
3.0.12013-05-16Good Sport[140][141]
3.0.02013-04-03Masked Marvel[142][143]
2.15.32013-03-01Security Blanket[144][145]
2.15.22012-10-26Trick or Treat[146][147]
2.15.12012-06-22Roasted Marshmallows[148][149]
2.15.02012-03-30Easter Beagle[150][151]
2.14.22012-02-29Gift-Getting SeasonSee It's the Easter Beagle, Charlie Brown and [152][153]
2.14.12011-12-22December Snowflakes[154][155]
2.14.02011-10-31Great PumpkinSee It's the Great Pumpkin, Charlie Brown and [156][157]
r-develN/AUnsuffered Consequences[158][34]

See also

Further reading

  • Wickham, Hadley; Çetinkaya-Rundel, Mine; Grolemund, Garrett (2023). R for data science: import, tidy, transform, visualize, and model data (2nd ed.). Beijing Boston Farnham Sebastopol Tokyo: O'Reilly. ISBN 978-1-4920-9740-2.
  • Gagolewski, Marek (2024). Deep R Programming. doi:10.5281/ZENODO.7490464. ISBN 978-0-6455719-2-9.

Portal

Notes

External links

References