R言語（アールげんご）はオープンソース・自由ソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境である。ファイル名拡張子は.r, .R, .RData, .rds, .rda。

R言語はニュージーランドのオークランド大学のRoss IhakaとRobert Clifford Gentlemanにより作られた。現在ではR Development Core Team によりメンテナンスと拡張がなされている。

R言語のソースコードは主にC言語、FORTRAN、そしてRによって開発された。

なお、R言語の仕様を実装した処理系の呼称名はプロジェクトを支援するフリーソフトウェア財団によれば『GNU R』であるが 、他の実装形態が存在しないために日本語での慣用的呼称に倣って、当記事では、仕様・実装を纏めて適宜にR言語や単にR等と呼ぶ。

 特徴 
R言語は文法的には、統計解析部分はAT&Tベル研究所が開発したS言語を参考としており、またデータ処理部分はSchemeの影響を受けている。

 ベクトル処理言語 
R言語は、「ベクトル処理」と呼ばれる実行機構により、柔軟な処理を簡便な記法で実現している。

R言語で言う「ベクトル」とは数学的用語のベクトルとはやや異なり「構造を持ったデータ集合」という「リスト」に近い意味を持つ。すなわち、実数や複素数からなる数学上のベクトルや行列はもちろん、配列・リスト・テーブル（データフレーム）・集合・時系列などといった複雑な構造を持ったデータも、特に宣言することなく変数に入れられる。
ベクトルの要素がさらにテーブルや時系列の配列などであるといった「入れ子構造」であってもよい。このおかげで複雑なデータ構造が他愛もなく構築・管理できる。

予約語としてRに組込まれた演算も、関数も、ベクトルを扱える。ユーザー定義関数をベクトル対応にするための関数もある。こうしたRの演算子やRの関数は、ベクトルの全要素に順に作用したり調べるといった構造にできている。そのおかげで、プログラム全体の制御構造が単純化して意味が明瞭になる。リストをうまく使うことによって、通常他の言語で複数要素を処理する時の「目的とする計算の本質とかけ離れたアルゴリズム」（たとえば、カウンターを使ったループや条件分岐等）の作成負担から解放される（他のプログラミング言語で似た記法を探すとすれば、たとえばLisp言語のmapcar関数、Perl言語のmap関数など）。

例として、円周率をモンテカルロ法で近似する計算を挙げる。
s <- 100000
x <- runif(s)
y <- runif(s)
sum(x^2 + y^2 <= 1) * 4 / s

ここで『 <- 』は代入（この場合『 = 』とも書けるが推奨はされていない）、『 runif(a) 』は一様乱数を a 個作りベクトルで返す関数、『 a^2 』は a の二乗、『 sum( a <= b) 』は引数のベクトル要素数を返す関数、を意味する。この場合sum関数の引数はTRUEまたはFALSEのリストからなる論理値型ベクトルである。ベクトルaおよびbの対応要素同士を比較演算子で比較した結果が並んでいるので、真であった個数が返る。

上の例で、sum関数によって、条件分け計算を複数回行なう指示が暗黙のうちになされていることに注目されたい。すなわち、0から1の値をとる一様乱数xとyの組からなる「サンプルを十万個作り、そのうち半径1の円内に入ったサンプルが何個かを数える。」という計算の本質を、forループのような繰返し処理の記述を必要とせず、簡潔に表現できている。

代入『 <- 』は「付値」と呼ばれる関数でもあり、以下のように一行に書き換えても意味は同じとなる。

sum(runif(s <- 100000)^2 + runif(s)^2 <= 1) * 4 / s

論理値型ベクトルは数値計算の関数や演算子に渡すと数値「TRUE=1」「FALSE=0」と解釈される。上記の計算では、それを利用して集約関数の sum で合計を出している。

ベクトルは「論理添字（元のベクトルと要素数が等しい論理値型ベクトルを用いた添字指定）」を使うことで要素の絞り込みができ、そのベクトルに対して付値を行うと、絞り込んだ要素だけを別内容に置き換えることが可能になる。論理添字も変数に付値すれば複数の取り回しはさらに簡素化する。

Rの添字では数値ベクトルによる「数値添字」も利用でき、変数に付値もでき要素抽出にも不自由なく使えるが、「論理添字」の場合は複数を揃えて論理計算できるため、数値添字だけでは難しい複雑な抽出処理が制御も分岐も使わず明快に出来る。

添字ベクトルxの利用は基本的に、1次元ベクトル・テーブルでは『変数 [x]』のように記述して指示する。行列などでは次元数に適宜準じ指定添字次元だけが間引き対象になり、時系列やレコードの部分抽出などに利用される。

以下は論理添字同士の論理計算を利用したFizzBuzz問題の解答例（記号"#"から改行まではコメント文）。

このコードをコメント文に照らして見れば、先の例と同様「ループもカウンターも条件分岐もないのに同等の処理ができる」ことを利用して、題意に沿った論理が無理なく実装できているとわかる。ここでは「FizzSet」と「BuzzSet」が論理添字変数であり、これらによる、抽出・置換・論理積を利用している。

なお、付値記号の矢印は代入の向きを左右どちら向きにもできる。一般的には左向き矢印が推奨されているが、機能は変わらないので混乱のない限り可読性の向上に利用できる。以下では「計算 -> 新規変数」「抽出要素 <- 置換値」の意味づけで用いている。# FizzBuzz問題・R言語のコード

# 1から100までの整数を、ベクトルで生成する。（n: 加工前の数列 ・ Ans: 加工後の結果用数列）
1:100 -> n -> Ans

# 3の倍数FizzSet相当のAns要素を、文字列"Fizz"に置き換える。（FizzSet: 3の倍数位置を示す論理ベクトル)
Ans[n %% 3 == 0 -> FizzSet] <- "Fizz"

# 5の倍数BuzzSet相当のAns要素を、文字列"Buzz"に置き換える。（BuzzSet: 5の倍数位置を示す論理ベクトル)
Ans[n %% 5 == 0 -> BuzzSet] <- "Buzz"

# 両倍数の共通集合相当のAns要素を、文字列"FizzBuzz"に置き換える。
Ans[FizzSet & BuzzSet] <- "FizzBuzz"

# 出力する。
cat(Ans)

ベクトルの各種演算に加えて、行列の各種演算が可能である。

イテレーターとしての for をはじめ各種制御命令も充実しているので、ベクトルや行列の簡潔な処理では書けない制御や大型の計算も記述できる。

 統計に適した解析環境 
最小限の労力で見通しよく解析するために工夫された命令体系を備えている。

ベクトル、配列、行列、データフレーム（テーブルに相当）、リスト、時系列、などの動的型付けデータ型。（後出「データ型」参照）
高階関数（データとして関数を操作する関数）をベクトル処理として記述できる
名前付き引数プレースホルダー「 _ 」を利用できるネイティブパイプ演算子「 |> 」
『モデル式』の導入により、複雑な統計モデル記述と曲線あてはめ等のモデルフィット指示を簡潔で統一的に表現できる
欠損値（NA）・無効値（NULL）・無限大（Inf,-Inf）・非数値（NaN）などの定数とそれらの検査関数
集合計算・複素数計算・時間日付計算・因子計算
d（確率密度関数）・p（累積分布関数）・q（分位関数）・r（乱数生成）の4機能と分布名を組合せる命名規則を持つ多次元確率分布機能関数
rep、seq、sequence、seq.Date、seq.POSIXt、combn、expand.grid、replicate、などベクトルシーケンスの規則生成関数群
mean, sum, cumsum, cumprod, rowMeans, table、などの集約関数群
apply, lapply, by, などの汎関数群や、Reduce, Map, Filter、などの高水準関数群
sample関数による数値・複素数・文字列などの加重標本抽出（サンプリング）記述
オブジェクト指向（関数・代入式もオブジェクト）（「オブジェクト指向」を参照のこと）
単純な構文・データ型宣言不要・名前空間（「仕様」を参照のこと）
文字列・式の相互変換やパターンマッチング検索・編集などの文字列操作
対話的処理だけでなくバッチ処理も可能
解析手法の比較検証には欠かせない「定番の検証用データ集」
ニューラルネット、決定木、クラスター、主成分・因子分析・多変量解析、線形・非線形・自己相関モデルなど、多数の高水準組込関数群
画像処理・音声合成・GIS・テキストマイニングなどCRANによって日々強化される拡張機能
擬似乱数生成法としてメルセンヌ・ツイスタ（デフォルト設定）や他の多種の生成法が選択可能
すべてのプラットフォームにおいて64bit対応

 高速な組込み関数群 
インタプリタでありながらも行列などの複雑なデータ構造に最適化された高速な組込み関数群を持つ（「処理速度」を参照のこと）
更なる高速計算が要求される場合にはC・C++・FORTRANなどの外部プログラムと動的リンクして拡張できる

 視覚化に優れたグラフ機能 
データのグラフ・図解化機能が柔軟でありインフォグラフィック環境とでも呼べるほど高度なグラフ作成ソフト機能を持つうえにユーザー独自の図解定義もプログラムが容易である
グラフ画像を多くの画像フォーマット・商業印刷品質で出力できる（「データのプロット」を参照のこと）

 データ互換性 
他の統計ソフト（Excelなど）のデータ読込みに対応している（「データ入出力」参照）。手軽なデータソースの例として、csvフォーマットのファイルを「read.csv("ファイル名")」というコマンドにより、Rの標準的なテーブルデータ形式であるデータフレームに自動変換して読込める。タブ区切りのテキスト形式（TSV）は「read.table("mytsv.txt", header=T, sep="\t")」で読み込める。
ODBC対応により各種データベースにアクセスできる。
webなど多様なデータソースからの入力形態に対応した「コネクション機能」を備える。

 ユーザープログラムを配信・利用できるCRANネットワーク機能 
世界中のRユーザが開発したRプログラム（ライブラリ）（これを「パッケージ」と呼ぶ）がCRAN (シーラン, The Comprehensive R Archive Network) と呼ばれるネットワークで配信されており、それらをR環境単独でオンラインでダウンロード・インストール・アップグレードと一連の管理が可能である。R-Forge等の他のサーバーも設定できる。CRANはRにシームレス統合されているため利用可能な機能（基本機能・オプションプログラムの両方）は日々増加拡張している。（「パッケージ」・「最近の展開」を参照のこと）

 教育現場から実務・研究現場へ永続的に利用可能 
マルチプラットフォーム・オープンソースで無償であるため誰もが同一作業環境を構築できる
「命令の文法が単純である」・「高水準な統計解析と視覚化機能・永続的な利用に耐える」などの理由で教育機関において統計学教育や統計処理を必要とする講義で利用し易いうえにプログラミングに手間取る事なく統計解析の教育・学習に専念できて解析のプロフェッショナルな道具であるので学習スキルは後々も実践で活かせる（「プログラムの入手」・「持続可能な統計環境」・「最近の展開」を参照のこと）

 言語仕様 
Rはマルチパラダイムなプログラミング言語である。広義の関数型言語の一つであるSchemeの影響を受けていて、リストを基本にした内部処理・遅延評価・静的スコープなどの特徴をもつ。インスタンス生成などオブジェクト指向機能ももっている。手続的な表記法にはCの影響がある。いわゆる「Hello, world」プログラムのコードと実行結果は以下とおり。
> print("Hello world")
 "Hello world"

 制御構造・サブルーチン 
for, if, while, repeat, switch, break といった構造化構文がある。自前の関数（手続き）を定義でき、自前の二項演算子さえも定義できる。関数は function 関数で生成する。次に、階乗を計算する自前の関数を生成し、toyfactorial として呼出せるようにする例を示す。

toyfactorial <- function (n) {
	if (n <= 0) return(NA)
	f <- function(i) {
 if (i == 1) return else return(i * Recall(i-1))
	}
	return(f(n))
}

上記は実用的ではないかもしれないが、関数のネスティング・再帰呼び出し・スコープの例として挙げた。R言語ではPascalやModula-2のように関数のネスティングが可能である。この例では、関数内部でさらに局所的な関数を生成し、f として参照している。スコープもPascal等と同様、辞書式で、関数 f の中ではその外側にある toyfactorial の変数が「見える」。f は局所変数なので、関数の外側に同じ名前の変数があっても影響を与えない。ただし、Rでは呼び出しスタックをさかのぼる動的スコープも実現可能である。

f の内部では自分の名前を参照できないので、自分自身を再帰的に呼び出すために Recall 関数を用いている。関数型の引数を利用することもでき、その場合複数の関数が互いに呼び出しあうことができ、また無名の関数をその場で定義して関数型の引数として渡せる。一種の複文のような用途に用いられる。NA(not available) は統計処理においては欠くことのできない特殊なデータ「欠損値」（欠測値）(missing value)で、データが無効であることを示す。

R言語の関数はそれ自体がオブジェクトであり、ある関数自体を外から参照したり書き換えられる。関数の本体部分を返す body 関数・仮引数リストを返す formals 関数・関数に付随する環境を返す environment 関数などが用意されている。

渡された式そのものを操作可能で、特定の環境（名前とポインタのリスト）の下で与えられた式を評価する eval 関数・渡された式の要素を環境に応じて置き換える substitute 関数・式を文字列に分解する deparse 関数等がある。

関数呼び出しも一種のリストとして処理されており、次のように call 関数を用いて、関数名と引数のリストから関数呼び出しオブジェクトを生成できる。

x <- 1:3
y <- 2:4
z <- call('plot', x, y)
eval(z)

関数はファイルから読み込むこともでき、さらには、パッケージとしてひとまとまりにもできる。

 オブジェクト指向 
R言語には継承やメソッドの実行時ディスパッチといったオブジェクト指向プログラミングの手法が取り入られており、数多くの総称的な (generic) 関数を持つ。これは同じ関数名であっても、取り扱うオブジェクトが属しているクラスによって独自の方法で処理を行うものである。Rでは、クラスはオブジェクトに付随する属性として扱われるものの一つであり、リストとして保持される。

 データ型 
数値型（複素数を含む）・文字型・論理型といった基本的な型やベクトル・リスト・行列といった統計処理や情報処理に必要な型を備えている。既述のように、関数それ自体もデータである。データフレームは配列ないしはリストの拡張版で、コラムごとに異なったデータ型を持てるため、表の形で表現されたデータを格納／操作するのに有用である。データフレームは行列から生成することもあるが、ここではリストとの関連で説明する。

 ベクトルとリスト 
ベクトル型は、データをある順序で並べたものである。 2:5 または c(2, 3, 4, 5) は数値型データ2, 3, 4, 5をこの順序で並べたものである。変数 a, b を同じ要素数をもつ数値型データのベクトルとすると、 a + b は両ベクトルを要素毎に加算してできた、同じ要素数の数値型ベクトルを返す。 a + 1 はベクトル a の各要素に1を加算したベクトルを返す。 c('猫', '猫', '犬') のように文字（列）型・論理型データを要素とするベクトルを作ることもできる。

リスト型は様々な型のデータを並べたものである。ベクトルのリストやリストのリストも可能である。 list 関数によって生成できる。

f1 <- c('猫', '猫', '犬')
f2 <- c(1, 2, 3)
f <- list(field1 = f1, field2 = f2)

文字型データを要素とするベクトル f1 ・数値型データを要素とするベクトル f2 からリスト f が生成される。 field1, field2 はリストの要素を指す「タグ」である。LISP風のdotted pair listも実装されているので必要に応じて用いられる。

 データフレーム 
さて、上記の2つのベクトル f1, f2 の要素数は等しい。このような場合、リストをデータフレームに変換できる。

df <- data.frame(f, row.names = c('たま ', 'みけ', 'ぽち'))

dfはデータフレーム型変数であり、各ROW（以下「行」）に「たま」「みけ」「ぽち」のラベルがつく。

もうすこし大きな表、例えば
 種 性別 月齢 愛らしさ たま 猫 ♀ 1 5 しろ 猫 ♂ 2 4 くろ 猫 ♂ 1 5 みけ 猫 ♀ 3 5 ぶち 猫 ♂ 12 3 とら 猫 ♂ 18 2 みゃぁ 猫 ♀ 30 4 猫じゃ 猫 ♂ 80 0 ぽち 犬 ♀ 2 5 ころ 犬 ♀ 10 5 たろ 犬 ♂ 40 3 じろ 犬 ♂ 40 3 じんぺい 犬 ♂ 50 2 わん 犬 ♀ 60 4 のらくろ 犬 ♂ 100 5

を例えば「犬猫」という名前の変数にデータフレームとして付値（代入に相当）すると、その内容は
 犬猫
種 性別 月齢 愛らしさ
たま 猫 ♀ 1 5
しろ 猫 ♂ 2 4
くろ 猫 ♂ 1 5
みけ 猫 ♀ 3 5
ぶち 猫 ♂ 12 3
とら 猫 ♂ 18 2
みゃぁ 猫 ♀ 30 4
猫じゃ 猫 ♂ 80 0
ぽち 犬 ♀ 2 5
ころ 犬 ♀ 10 5
たろ 犬 ♂ 40 3
じろ 犬 ♂ 40 3
じんぺい 犬 ♂ 50 2
わん 犬 ♀ 60 4
のらくろ 犬 ♂ 100 5

のように、本来のデータをよく表現するものとなっている。それだけでなく、「猫」「犬」「♀」「♂」などの文字データは内部的に因子ないしはカテゴリに変換されている。データフレームから特定のデータコラムを抽出するには 変数名$タグ名 、例えば、 犬猫$月齢 とする。特定のデータ行だけを抽出するには subset 関数または要素の指定 [ ] を用いる。例えば、

猫 <- subset(犬猫, 犬猫['種'] == '猫')
犬 <- 犬猫[犬猫['種'] == '犬']
t.test(猫$愛らしさ, 犬$愛らしさ)

は「愛らしさ」の平均値を猫と犬の間でt検定する（この例では、p値 = 0.6537 となる）。

 機能 
Rには標準状態でも統計、検定、解析向けの強力な関数が備わっており、必要に応じて新たな関数を定義でき（既述のとおり、CやFORTRANなどによって記述し、外部でコンパイルした関数を呼び出せる）、自分でプログラムを書かなくても、多くのパッケージを利用できる。これに加えて、便利な入出力機能やグラフ作成機能を備えている。

 データ入出力 
ベクトルを読み込む scan 関数や簡易にデータフレームを読み込める read.table 関数等のようにテキストファイル入出力用のさまざまな関数が用意されている。また、市販の統計解析パッケージSPSS・SAS等の独自形式バイナリデータを直接扱うこともできる。画像をバイナリデータとして読むこともでき、読み込み後は行列として扱えるので、画像処理にも用い得る。パイプやソケット（ポート参照）を扱う関数も用意されている。

 データのプロット 
plot 関数によって多彩なプロットができる。 plot は総称的な関数であり、引数として渡されたデータの種類によって、自動的に様々なグラフを描き分ける。他にヒストグラムを描画する関数、イメージを描画する関数など高レベルの描画関数がある。これらはデフォルトでも機能するが、細かなパラメーターを指定することもできる。加えて、単に線を引いたり点を打ったりする低レベルの描画関数も用意されているため、好みのグラフを生成できる。プロットは画面に対して行われるだけでなく、PDF・SVG・PS・PNGといった形式の出力を直接行える。

図にデフォルトでのプロット例を示す。上から順に plot(犬猫$種, 犬猫$性別) ・ plot(sin(seq(0, 2 *pi, 0.1))) ・ image(x <- -50:50, x, x %*% t(x)) の実行結果である。 seq 関数は等差級数からなるベクトルを生成する。 %*% は行列の積を計算する演算子、 t は転置行列を生成する関数である。最初の例では先に扱った動物種毎の性比を表示、次の例では、正弦関数（自動的にベクトルの添字が横軸となり、ベクトル生成式が縦軸のラベルとなっている）を表示し、最後の例では、引数を評価する中でベクトルを生成してxに代入し、積を計算し、その各要素の値を色の濃さで表現している。

 ワークスペースの保存 
現在の作業状況に名前を付けて保存し、後に再利用できる。コマンドを発行するコンソールの内容も保存できるので、どのような処理を行って結果を得たかを確実に記録し、再現できる。発見的操作を伴う研究用途では極めて重要な要素である。