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

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パッケージ! 是非っ!!

2017年4月1日、ドイツのRユーザ @henningswayが東京へやって来るということで、Global Tokyo.R#2が開催されました。ホクソエム各位も運営や発表を行いました!!というわけで今回の記事はGlobal Tokyo.Rの参加レポートとなります。

Contents Presenter Slide
No packages? OK, develop it !!! @hoxo_m link
Bayesian analysis of psychological pressure during penalty shootout @Med_KU -
Blogdown @henningsway -
Customizing Awesome Maps with Leaflet @u_ribo -
Awesome talk @tomomoto -
R package to tune parameters using Bayesian Optimization @y__mattu link
Rcpp for everyone @teuder link

No packages? OK, develop it !!! by hoxo_m

当社代表@hoxo_mの発表です。我々の心のありかとなっている「なければ作る」という言葉にもとづき、GitHub上のパッケージのインストールを簡易に行うgithubinstallパッケージmagicfordplyr.teradataの開発背景や導入の話でした。

これまでに数多くのパッケージを作っている@hoxo_mだからこその「なければ作る」の一言は説得力があります。

スライド:

www.slideshare.net

Bayesian analysis of psychological pressure during penalty shootout by Med_KU

発表者が会場にいないスタイルの発表にざわつきがありました。サッカーのペナルティーキックの試行に対する影響をrstanで推定するという内容でした。Find A Job、だそうです。なお発表スライドはアップロードされないみたいです。残念!

スライド: -

Blogdown by henningsway

RMarkdownで書けるブログシステムblogdownパッケージの説明です。henningswayさんがライブコーディングでブログを構築、記事を書き上げて会場は大盛り上がりでした。また、スライドの作成もRMarkdown (xaringan)を使っており、日本のRユーザの知らない情報をたくさん共有していただけました。

海外でもブログは就職や転職活動を行う上でも利用されているようで、Rの実行結果をそのまま記事にできるblogdownは大きな可能性を持っているように感じました。皆さんもブログ是非っ!

ちなみにですが、このブログもblogdownを使っています。

スライド: -

Customizing Awesome Maps with Leaflet by u_ribo

leafletパッケージを使ったインタラクティブな地図操作の方法を紹介しました。また、leafletの機能を拡張するleaflet.extrasについても話しました。

ちなみにこんなことをしていました。スライドは公開しておりません。すみません!

スライド: -

Awesome talk by tomomoto

awesomeになるにはどうすれば良いか。アメリカ西海岸のベンチャー企業のデータ分析担当の組織体制や取り組みについて貴重な話を伺えました。

スライド: -

R package to tune parameters using Bayesian Optimization by y__mattu

既存パッケージによるベイズ最適化を行う際のチューニングが手間という理由から、パッケージを作ったという話でした。RMarkdownを使ったスライドでは、途中でスライドに落書きを行うなど、まるで講義・セミナーのような発表でした。

MlBayesOptパッケージ、是非!

スライド:

R package to tune parameters using Bayesian Optimization

@teuderさんの発表は、Rcppについて興味があるけどどうしたらわからないという方向けのプレゼンテーションでした。スライドにも書かれていますが、海外にはRcppに関する文書がいくつか見られます。しかし日本にはそれに該当するものがありません…。そこで「なければ作る」の登場です。@teuderさんはなんとRcpp本の執筆プロジェクトを進められているそうです!こちらも期待ですね。

スライド:

speakerdeck.com

会場案内や準備・片付けを手伝ってくれた方々や、会場および懇親会の提供をして頂いた株式会社リクルートコミュニケーションズさんに感謝です。次回のGlobal Tokyo.Rで会いましょう!

写真

集合写真

https://github.com/HOXOMInc/blog/blob/master/docs/img/globaltokyor_photo1.jpeg?raw=true

関連した記事

d.hatena.ne.jp