July 29, 2020

R:記号を含む文字列を検索する際の注意点

Rで記号を含む文字列を扱う際には、正規表現に注意が必要だ。

例えば、以下の文字列strから、(12)の場所を探すことを考える。
str <- c("(12)", "(123)", "(132)")

grepやstr_matchで"(12)"を検索にかけると、"(123)"まで選ばれてしまう。
grep("(12)", str)
[1] 1 2

これは、rの正規表現(Regular expression)に則ると括弧が認識されないので、実質的に"12"で検索している状態となっていることが原因である。

ここで(12)だけを抽出するためには、
1. 括弧を"\\("または"\\)"で表現する または、
2. "\\b"で境界を作る と良い。
grep("\\(12\\)", str)
[1] 1
grep("\\b(12)\\b", str)
[1] 1

(追記)
fixed = TRUE を挿入すると、正規表現ではない文字として扱ってもらえる。
grep("(12)", str, fixed = TRUE)
[1] 1




July 22, 2020

R:Shiny serverのパッケージ設定

ubuntuでShiny serverを設定する際には、パッケージのインストールに気を付けなければならない。
/srv に置かれたプログラムを実行する際は、ローカルに置かれたパッケージ(例えば /home/{user}/R/x86_64-pc-linux-gnu-library/4.0)を参照することができない。
これは、以下の方法では解消できなかった (少なくとも自分の環境では)。

失敗試行1. chownコマンドを使って、上記のフォルダにshiny(ユーザー)がアクセスできるようにする
失敗試行2. /etc/shiny-server/shiny-server.conf にアクセスし、run_as をshinyではなく自分の名前に変更する

shinyが参照するライブラリの場所は /usr/lib/R/site-library または /usr/lib/R/library になる。ここはroot権限の場所になるため、以下のようにターミナルからRを経由して(RStudioは使わずに)パッケージをインストールする。

sudo su - -c "R -e \"install.packages('foo')\""


July 17, 2020

R:パッケージのアップデート

Rのパッケージをアップデートしたい場合は、Rのコンソールより

.libPaths()

でライブラリの場所を確認する。パッケージがの場所がおそらく複数表示される。
アップデートしたいパッケージが入っている場所を確認し、例えば1番最初の場所だったら

update.packages(.libPaths()[1])

とコマンドする。この操作によって、パッケージを簡単にまとめてアップデートできる。
パッケージごとにアップデートするかどうかを聞かれるのを防ぎたい場合は、以下のオプションを入れると良い。

update.packages(.libPaths()[1], ask = FALSE)

ちなみに、個別にパッケージをインストールする場合は、こちらのページが参考になる。

*****

また、今回Ubuntu18.04においてパッケージのアップデートを行ったところ、以下のようなエラーが出てインストールが止まった。

In install.packages(update[instlib == l, "Package"], l, contriburl = contriburl,  :   installation of package ‘plotly’ had non-zero exit status


この原因は、元のフォルダに古いパッケージが残っていることであった。
そこで、以下の手順で解消された。

1) パッケージが置かれている場所の権限を変える。
sudo usermod -a -G staff your_user_name
sudo chown -R your_user_name:staff /user/local/lib/R/site-library

2) 古いパッケージを消す

3) インストールし直す


July 10, 2020

R:異なるモード型の行列をまとめる

異なるモード型の行列があるとき (c1: character, c2: numeric)

c1 <- matrix(c("a","b","c"), nrow=3, ncol=1)
c2 <- matrix(c(1:3), nrow=3, ncol=1)

cbindで結合すると、数字のモード型が文字に変換されてしまう。

mat <- cbind(c1,c2)
mode(mat[2,2])
[1] "character"

この問題は、データフレームに収めることで解決する。

df <- data.frame(c1,c2)
mode(df[2,2])
[1] "numeric"