LoginSignup
0
0

More than 5 years have passed since last update.

Rからerb記述が含まれるyamlを読み込む

Posted at

RからRubyを呼び出す

余り綺麗な方法ではありませんが

> system('ruby -e "puts 1+1"', intern=TRUE)
[1] "2"
> system("ruby script.rb", intern=T)

とすることでRからRubyを呼び出せます。

erb記述の含まれるyamlを読み込む

Rにはlibrary(yaml)があるため通常のyamlファイルはyaml.load_file(input)とすることで呼び出せますが、Rubyで利用しているyamlファイルにerb記述がある場合は展開されません。
環境変数にDBの設定などを記述して、RとRubyの両方で環境に応じた接続を切り替えたい場合に少し不便です。
ちょっと無理矢理ですが楽に読み込めたので、その方法を記述しておきます。
もっと良い方法があるはずなので、知っている方は教えてくれると嬉しいです。

load_erb.rb

適当にerbを読み込んで展開、表示するだけのスクリプト

require 'erb'
p ERB.new(File.read('database.yml')).result

system(script) from R

yaml.load(yaml.load(system("ruby load_erb.rb", intern=T)))

$test
$test$adapter
[1] "sqlite3"

$test$database
[1] "db/test.sqlite3"

$test$pool
[1] 5

$test$timeout
[1] 5000

yaml.loadで一度パースされた文字列を再度パースすることで読み込んでいます。

わざわざ2行のスクリプトを用意せずともインラインで呼び出すのも良いと思います。

eq <- "ruby -e 'require \"erb\"; p ERB.new(File.read(\"database.yml\")).result'"
yaml.load(yaml.load(system(eq, intern=T)))

エスケープが若干面倒で見た目が汚いですが、実用には足ります。
pathを渡せるようにするならこんな感じでしょうか。

yaml.load_erb <- function(path){
 eq <- paste("ruby -e 'require \"erb\"; p ERB.new(File.read(\"", path,"\")).result'", collapse='', sep='')
 yaml.load(yaml.load(system(eq, intern=T)))
}

余りニーズのある領域ではなさそうですが、もっとスマートなやり方が知りたいです。

0
0
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
0
0