Rabbit is Rapidly Apply Basic But Impactful Text string utilities.
Rabbitは、 Rでのプログラミングで使える 簡単で便利な文字列操作などの関数を集めたパッケージです。
You can install the development version of rabbit from GitHub with:
インストールは以下の通り。
# install.packages("devtools")
devtools::install_github("syunsuke/rabbit")
fetch_date_from_string()
関数は、
文字列に含まれる日付から日付オブジェクトを生成します。
主に、和暦(元号での表記)が含まれている場合に役立ちます。
library(rabbit)
fetch_date_from_string("この文書は平成11年2月3日に書かれました。")
#> [1] "1999-02-03"
文字列に含まれる何年何月までのものは1日を指すようにします。
fetch_date_from_string("私は昭和43年7月生まれです。")
#> [1] "1968-07-01"
注意
文字列の中に複数日付文字列がある場合には、1つ目の日付のみが返ります。 また、日付に類似する部分が混在すると、その部分を認識してしまうことがあります。 関数に渡す文字列は、事前に日付を表すと思われる部分に絞って渡すと混乱がなくなります。
Rのコードの約束事として、
ソースコードはASCIIコードを使用することとなっています。
実際には、ASCIIコード以外で、日本後の文字等をリテラル表記をしても
動作しますが、パッケージのcheck()
関数ではwarnningが出たり、
CRANに登録する際には、この約束事を守る必要があります。
エスケープされたユニコードでの表示とは、以下のようなものです。
リテラル | ユニコード |
---|---|
猫 | \u732b |
実際の日本語リテラルの入っているコードは以下のようなものです。
stringr::str_extract("[0-9]{4}年[0-9]+月[0-9]+日")
実際の日本語リテラルを使わずASCIIコードで表現したものは以下のようになります。
#stringr::str_extract("[0-9]{4}年[0-9]+月[0-9]+日")
stringr::str_extract("[0-9]{4}\u5e74[0-9]+\u6708[0-9]+\u65e5")
この処理のアイディアは、 【R】 日本語を含むコードを丸ごとエスケープさせる方法 で紹介されていた方法を基礎にしています。 既存のエスケープ関数を利用してトリッキーに変換を行っているので、 複雑にエスケープされたエスケープ文字等が混在すると、 思いもよらない変換が起こる可能性があります。 なるべく、日本語リテラルをASCIIに変換するという目の届く範囲での運用を想定し、 ファイル全体を自動で書き換える等の運用は想定していません(何が起こるかわからない)。
jp2unicode()
関数は、この変換を行ってくれます。
target <- 'stringr::str_extract("[0-9]{4}年[0-9]+月[0-9]+日")'
jp2unicode(target)
#> [1] "stringr::str_extract(\"[0-9]{4}\\u5e74[0-9]+\\u6708[0-9]+\\u65e5\")"
Rの場合、文字列の値を表現するとエスケープ文字が入ってしまいます。 ですから、実際のコードに表記する場合は次のように’message()’関数で、 標準出力等に表示させます。
target <- 'stringr::str_extract("[0-9]{4}年[0-9]+月[0-9]+日")'
jp2unicode(target) %>% message()
#> stringr::str_extract("[0-9]{4}\u5e74[0-9]+\u6708[0-9]+\u65e5")
これを該当するコードの部分にコピー&ペーストすることで、 日本語リテラルをASCIIコードのみで表現できるようになります。
jp2uni_clip_convert()
関数は、
クリップボード内の文字列を変換してくれます。
なので、ソースコードの変換したい行をコピーして
クリップボードにある状態で、
コンソール等でjp2uni_clip_convert()
関数を実行し、
それから何処かへペーストすると、変換された文字列がペーストされます。
実用的にはこれが一番使いやすいと思います。
jp2unicode()
関数は、文字列のベクトルを受け取ります。
ですから、ファイルをreadLines()
関数で受け取って、
それをjp2unicode()
に渡すことで、全文の変換も行えます。
以下は、ソースコードの一部を変換するサンプルです。
file_path <- "R/jc2ad.R"
readLines(file_path) %>% .[46:53] %>%
jp2unicode() %>%
paste(collapse = "\n") %>%
message()
#> #reiwa2ad <- sub_jc2ad_strconv_func("令和",2019)
#> reiwa2ad <- sub_jc2ad_strconv_func("\u4ee4\u548c",2019)
#>
#> #heisei2ad <- sub_jc2ad_strconv_func("平成",1989)
#> heisei2ad <- sub_jc2ad_strconv_func("\u5e73\u6210",1989)
#>
#> #syouwa2ad <- sub_jc2ad_strconv_func("昭和",1926)
#> syouwa2ad <- sub_jc2ad_strconv_func("\u662d\u548c",1926)
出力をファイルにすることも出来ます。
file_path <- "R/jc2ad.R"
readLines(file_path) %>%
jp2unicode() %>%
writeLines("devwork/jc2ad_ascii.R")