はじめに
特殊なコーディングでも、特殊なパッケージを使用しているわけでもありません。
仕事で文字列を処理することは少ないため普段使用しない関数などの発見があったため記事として残したいと考えました。
今回はシンプルな内容ですが、段階を踏んで有用な関数作成にも挑戦したいと思います。
ROT13(rotate by 13 places)とは
単換字式暗号(シーザー暗号)の一つで、アルファベットを一文字毎に13文字後のアルファベットに置き換えます。
例: Hello → Uryyb
アルファベットは26文字のため、2度暗号化することで元の文字列に戻ることが特徴です。
Rでコーディング
以下が作成したROT13暗号化関数です。
ROT13 <- function(x) {
chr.old <- paste(c(LETTERS, letters), collapse="")
chr.new <- paste(substr(chr.old, 14, 26), substr(chr.old, 1, 13),
substr(chr.old, 40, 52), substr(chr.old, 27, 39),
collapse="", sep="")
return(chartr(chr.old, chr.new, x))
}
関数内での処理内容
まず、変換する前の大文字小文字の2*26文字を格納した変数chr.old
を作成します。
LETTERS
はデフォルトで用意されている大文字A~Zを一文字ずつ格納しているベクトルで、letters
はLETTERS
を小文字にしたベクトルです。
後述しますが、関数chartr()
で使用するためにベクトル内の各要素をpaste(, collapse="")
で結合します。
変数chr.new
はchr.old
の大文字と小文字をそれぞれ13文字ずらした並びにした文字列を格納します。
最後に、関数chartr()
で引数の文字列を置換した結果を返します。
chartr(old, new, x)
はold
と一致するx
の文字をnew
に変換します。
old
とnew
は同じ位置の文字が対応します。つまり、old
の1文字目がnew
の1文字目に、old
の2文字目がnew
の2文字目に変換されます。
今回の場合だと以下のようになります。
old: ABC・・・NML・・XYZabc・・・nml・・・xyz
new: NOP・・・ABC・・KLMnop・・・abc・・・klm
A→N, X→K, n→a, z→m
実行結果
参考文献