LoginSignup
1
2

【R】library関数に変数を渡すときの注意点

Last updated at Posted at 2024-04-20

install.packages()は普通に変数参照で実行できることが判明したため記載見直しました。申し訳ありません。(2024.05.03)

TL;DR

install.packages(), library()の引数に変数を渡したい場合、character.only=TRUEオプションが必要

経緯

  • インストール済のパッケージに対してinstall.packages()したときに例外吐くのがなんか嫌なので、インストール済のパッケージはインストールを飛ばすようにしたい
  • パッケージ名のベクトルを作って、install.packages()に変数でパッケージ名を渡してやればいいはず
  • ついでにlibrary()で読み込む関数もベクトルで管理できるとイケてるよね
  • 以下で実装
hoge.R
# インストールしたいパッケージのベクトルを作る
required_packages <- c("dplyr", "jsonlite")
installed_packages <- rownames(installed.packages())
missing_packages <- required_packages[!(required_packages %in% installed_packages)]

# インストール
sapply(missing_packages, function(p){
  install.packages(p)
})
sapply(required_packages, function(p){
  library(p)
})

問題

以下の例外が発生。
変数の中身じゃなくて変数名が解釈されてる!?!?!?

Console
> library(p)
library(p) でエラー:  p という名前のパッケージはありません

対策

library関数にcharacter.only=TRUEオプションが必要

hoge.R
library(p, character.only = TRUE)

原因

こういう仕様です、としか言いようがない…

実装も読みつつ諸々調べたが、渡された引数pはデフォルトだと解析はされるが式として評価されない実装になっている模様。

この実装だと何が嬉しいのかは全く理解できてない。今後の課題ですね。。。

※参考:library()関数の該当箇所実装

余談

install.packages()関数のお話。

これ書くためにドキュメント読んでて初めて知ったこと。
install.packages()に限り、引数にはベクトルを渡せるらしい。
つまりapplyなんか嚙ませなくても以下の一発でいける。マジかよ。。。

hoge.R
install.packages(missing_packages)

感想

Rのこういう他言語の常識を平気で裏切ってくるところ結構好きだったりはします。

参考資料

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2