Rから(ほぼ任意の)Rubyを自由に呼べるようにした

id:ujihisaがRubyKaigiでRubyの中でHaskellとかを書いていたりして、とても楽しそうだったので、僕もRの中でRubyを使いたいと思った!!

なので、やろうとしたんだけど、RにはEOFみたいなヒアドキュメントがない。Rのコードの中にpasteとかでつなぎまくればどうにかなるんだけど、Rubyのコードの中に「"」とかが出てくると、途端にややこしくなる。で、正規表現とかでどうにか処理をしようとしていたんだけど、「'」とかもあったりして、任意のコードで色々できるようにするのは難しそうであった。。。

でも、途中で思い出した!!Rubyにはシンボルを文字列っぽい感じで使うことができるんだった!!ということでRubyの「"」と「'」をシンボルで書き換えたようなコードを実行できるようになった!!幸せ!!例えば、Twitterにpostするような関数はこんなの。

post <- function(update){
  ruby <- paste("
require :rubygems.to_s
require :twitter.to_s

name = :username.to_s
password = password.to_s
twit = Twitter::Base.new(name,password)
twit.update(\"",update,"\")
",sep="")
  system(paste("echo '",ruby,"'"," | ruby ",sep=""))
}

で、こういう風に使える。

post("blogにpostしようと思ったけど、昨日飯何もくってねええええええ")

Rの実行結果とかも送れちゃうよ!!素敵!!

post(eval(parse(text="apply(cars,2,sum)")))

これを.Rprofileとかに書いておけば、Rをやってる時にはいつでもTwitterにpostできますね!!Rで快適に連投する11の方法の一つ目ができました!!