株式会社ホクソエムのブログ

R, Python, データ分析, 機械学習

ナウでヤングなRの環境変数管理方法

こんにちは。ホクソエムのグローバル推進事業部にて本部長を努めます瓜生(@u_ribo)です。この記事ではRにおける環境変数の設定方法のおさらいと、ナウな手法を使った環境変数の管理方法について紹介します。

環境変数を利用していますか?

Rでは、利用している環境やユーザの設定を環境変数として記録・利用できるようになっています。具体的な項目についてはドキュメントに記されている通りですが、例えばユーザのホームディレクトリ (HOME)やロケール (LC_ALL)などがあります。こうした環境変数は直接意識して利用することは稀ですが、頻繁に使う値やディレクトリのパスなどを環境変数として保存しておくと便利なことがあります。

現在設定されている環境変数の値を確認するにはSys.getenv()関数を実行します。引数に何も指定せずに実行すると全ての環境変数と値が出力されますが、引数に環境変数名を指定することで個別の値を参照することもできます。

Sys.getenv("HOME")
## [1] "/Users/uri"

またRのセッション中で環境変数を設定したり変更が可能です。変更にはSys.setenv()を使います。デフォルトでは存在しないCODE_NAMEという環境変数を作ってみましょう。

# CODE_NAMEという環境変数は定義されていないので空白値が返ってくる
Sys.getenv("CODE_NAME")

## [1] ""

# 環境変数CODE_NAMEと値を与えます
Sys.setenv("CODE_NAME" = "HOXO_URI")
# 環境変数CODE_NAMEの値を参照します
Sys.getenv("CODE_NAME")

## [1] "HOXO_URI"

# 環境変数を削除します (Rを再起動するとデフォルトで登録されていない環境変数は削除されます)
Sys.unsetenv("CODE_NAME")

この方法ではRの起動時に都度、環境変数を定義することになるので面倒です。そこでRでは.Renviron.Rprofileという設定ファイルの中で環境変数を定義することができるようになっています (参考)。

configパッケージ

上記の設定ファイルは隠しファイルとなっており、管理が面倒なことがあります。また例えばテストや開発、一時的に使うといった用途に応じて異なる値の環境変数を用いたい場合、これらのファイルを利用するのは優れた方法とはいえません。

状況に応じて変数の値を切り替えたい… そういう時があると思いますっ!そこで今回紹介するconfigパッケージの登場です!

https://github.com/rstudio/config

configの使い方

configパッケージは、YAMLファイルに変数として扱いたい項目と値を記述することでRからその値を参照可能にします。そのため、YAMLファイルを設定ファイルとして、項目と値を環境変数のように扱うことが可能になります。説明のため下記のようなconfig.ymlファイルを用意します。これは利用するユーザに応じてusernameとroleという変数の値を変更させるためのファイルとなります。

default:
  username: "admin"
  role: "admin"

develop: 
  username: "dev"
  role: "admin"

guest:
  username: "guest"
  role: "user"

ではconfigパッケージを使ってconfig.ymlの値を参照しましょう。configは現在GitHub上で開発が行われているので、githubinstallパッケージなどを使ってインストールする必要があります。

# install.packages("githubinstall")
githubinstall::gh_install_packages("config")

library(config)

configの主要な関数はget()です。この関数が設定ファイルを読み込みます。デフォルトでは作業ディレクトリにあるconfig.ymlファイルの中身を読みますが、読み込み関数の引数の変更によって設定ファイル名やパスを変更できます。

# Rから扱いやすくするためオブジェクトとして保存する
conf <- config::get()

config::get()の値を一度オブジェクトとして保存しておくと、configの値が参照しやすくなります。あるいはget()で直接変数名を指定するのも方法の一つです。

conf$username

## [1] "admin"

conf$role

## [1] "admin"

## [1] "admin"

config::get("role")

ここでget()で指定可能な項目を確認してみましょう。get()には次の引数が含まれます。

value
設定ファイルconfig.ymlに記述された項目を指定することでその値を参照する。指定しない場合、config.yml中の全ての値を返す

config
環境変数R_CONFIG_NAMEで指定された設定項目。デフォルトで設定ファイルのdefaultに含まれる変数を扱うようになる

file
設定ファイルを指定。デフォルトで作業ディレクトリに含まれるconfig.ymlを扱う。異なるパス、ファイル名の場合に指定する必要がある

use_parent
上位のディレクトリに設定ファイルが含まれる場合、FALSEを指定することで上位ディレクトリの設定ファイルを読み込まない

config.ymlのdefaultの値から、developの値に切り替える場合は次のコマンドを実行します。

config::get(config = "develop")
## $username
## [1] "dev"
## 
## $role
## [1] "admin"
## 
## attr(,"config")
## [1] "develop"
## attr(,"file")
## [1] "config.yml"

私は、ギョームでよく使う環境変数(データベースのホストやAPIキーなど)はconfig.ymlに書いておいて、config::get()でオブジェクトとして保存されたものを呼び出すという使い方をしています。ローカルとサーバ上のRStudio Serverで異なる値を利用する機会があるのでconfigが役立っています。なおGitリポジトリに登録する際は、cofigの内容が公開されても問題ないものか、今一度確認しましょう。プライベートリポジトリに保存しておくのも手段かもしれません。

類似のパッケージ・プロジェクト

面倒な環境変数の管理にconfigパッケージ! 是非っ!!