Google
WWWを検索
サイト内を検索

他のプログラミング言語を経験してからRをいじりだした人に多いと思うのですが、便利関数で簡潔に実現できる処理を、ループ処理で複雑に書いて、苦労した上に見通しとパフォーマンスが悪いコードを生成することがあります。

1 三項演算関数(ifelse

C言語の三項演算子に該当する関数があります。

ifelse(c(1, 0) > c(0, 1), "left-side is bigger.", "left-side is not bigger.")
[1] "left-side is bigger."     "left-side is not bigger."

2 分岐(switch

Rにもswitch文がありました。

switch("a", a = 123, b = 456, c = 789)
[1] 123
switch("b", a = 123, b = 456, c = 789)
[1] 456
switch("c", a = 123, b = 456, c = 789)
[1] 789

ベクトル処理ができないので、まとめて処理するときにはunlistとsapplyを組み合わせるしか無いようです。

unlist(sapply(c("a", "b", "c"), 
    switch, a = 123, b = 456, c = 789))
  a   b   c 
123 456 789 

3 正規表現

Rでも正規表現によるテキスト処理ができます。

txt <- c("This is a pen.", "This is an apple.")
# isが含まれる要素の位置
grep("[^a-z]is[^a-z]", txt) 
[1] 1 2
# appleが含まれる要素
grep("apple", txt, value = TRUE) 
[1] "This is an apple."
# appleが含まれない要素
grep("apple", txt, value = TRUE, invert = TRUE) 
[1] "This is a pen."
# isをwasに置換(1要素に複数あってもすべて置換)
gsub("([^a-z])(is)([^a-z])", "\\1was\\3", txt)
[1] "This was a pen."    "This was an apple."
# 空白で分割
strsplit(txt, " ")
[[1]]
[1] "This" "is"   "a"    "pen."

[[2]]
[1] "This"   "is"     "an"     "apple."

置換時の括弧の中の文字列は\\1といったエスケープ文字と数字の組み合わせで表現されることに注意しましょう。 なお、括弧自体をマッチングしたい場合は、

gsub("\\(", "括弧始", "(...)")
[1] "括弧始...)"

と言うように括弧の前にエスケープ文字をつけます。

4 \({}_m\!C_n\)

組み合わせの数の計算ができるchoose関数があります。コンビネーションではないので注意しましょう。

# 5!/(3!2!)
choose(5, 3)
[1] 10
# factorialで書くと長々として遅い
factorial(5)/(factorial(3)*factorial(2))
[1] 10

5 対話モードで動いているか調べる

interactive()TRUEが戻って来た場合は対話モードで動いています。バッチ処理と対話モードで挙動を変えたいときに使えます。

6 GUIのファイル・ダイアログを使う

使いどころは乏しい気もしますが、file.choose()でできます。

7 ソースコードの読み込み

テキストファイルに書いたソースコードを読み込んで実行できます。

source("source.R")

UTF-8に統一されつつある昨今ですが、引数fileEncodingで文字コードを指定して読み込むこともできます。

echo=TRUEをつけると、実行前にコードを表示します。

引数chdirで実行するディレクトリを指定できます。また、local=TRUEをつけると、環境を分離してワークスペースにオブジェクトを追加しないようにできます。

8 テキストエディタの呼び出し

対話モードでテキストエディタを呼び出すことができます。環境変数EDITORや引数で指定しない場合、エディタはOSの標準エディタが呼ばれます。

8.1 ソースファイルを編集

ファイルに書いておいて、sourceで読み出して実行ができます。

file.edit("source.R")

8.2 関数を編集

関数を指定すると、ファイルを作らないでも編集できます。なお、ワークスペースに存在しない関数を指定すると、新規編集になります。

fix(func)

9 オブジェクトの保存と読み込み

Rのあらゆる変数は同様に保存と読み込みができます。つまり、ベクトル、行列、配列、リスト、データフレーム、環境、関数、モデル式といったオブジェクトは、saveRDSで保存して、readRDSで読み込むことができます。

fnc1 <- function(a, b) (a + 1)*(b - 1) # 関数を定義
saveRDS(fnc1, "fnc.RDS") # 関数を保存
rm(fnc1) # 関数を消す
fnc2 <- readRDS("fnc.RDS") # 関数を読み込む
fnc2(2, 3) # 関数を使う
[1] 6

他のプログラミング言語でも似たようなことはできるのですが、パッケージなしで同じぐらい広範なオブジェクトを同じぐらい容易にできるものはちょっと思い当たりません。

10 ワークスペースの保存と読み込み

現在のワークスペースのすべてのオブジェクトを保存したい場合はsave.imageを用いることができます。読み込むときはloadを使います。

n <- 100
x <- 1:n
z <- runif(n, min = 1, max = 100)
y <- 1 + x - z + rnorm(n, sd = 10)
save.image(file = "example.RData")
ls() # 作成したオブジェクトを確認
[1] "n" "x" "y" "z"
rm(list = ls()) # 前オブジェクト消去
ls() # 空になったのを確認
character(0)
load(file = "example.RData")

ls()をすると、消したオブジェクトn,x,z,yが復活しているのが分かります。 なお、quit(save = "yes")とすると、自動でsave.imageが呼び出されます。