読者です 読者をやめる 読者になる 読者になる

littlerを使ってRで危険シェル芸とかできそう

追記:Mac は大文字小文字を区別しないので、このままインストールすると大文字の方のRと名前がかぶって危険らしいです。READMEによるとmake installの前に--program-prefix="l"みたいにすれば別名(この場合はlr)でインストールできるみたいですが、うまくいくかは未確認です。


Jamiroquaiの名曲と言えばLittle Lですが、我らがR界にはDirkがつくったlittlerというのがあるらしいです。あるらしいです、というかけっこう前からあったけど私が知らなかっただけです。

littler examples: how to use a scripting front-end for GNU R
eddelbuettel/littler · GitHub

A scripting and command-line front-end for GNU R

インストール

(詳しくはlittler: a scripting front-end for GNU Rの「Where?」に書いてあります)

Debian系OSのひと

apt-getでさくっと入れられます。

# apt-get install littler

最新版がほしいひと or それ以外のLinuxを使っているひと

Githubからソースを落としてきてビルドすれば使えます。

# apt-get install autotools-dev
$ git clone https://github.com/eddelbuettel/littler.git
$ cd littler
$ ./bootstrap
# make install

私は最新版のexampleコードを使いたかったので、このやり方でやりました。

Windowsのひと

ビルドできるのか不明。そもそもlittlerはWindows向けではないのであんま期待しない方がよさそう。

使ってみる

Hello World

コマンド名は小文字のrです。-eオプションで、文字列をRのスクリプトとして実行してくれます。

$ r -e 'print("Hello World!")'
[1] "Hello World!"

シェルのパイプと組み合わせて

これもexamplesに載ってる例ですけど、こんなワンライナーが書けます。

$ ls -l /boot | awk '!/^total/ {print $5}' | r -e "fsizes <- as.integer(readLines(file(\"stdin\"))); print(summary(fsizes)); stem(fsizes)"
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.
    1024   165700  3387000  5411000  5814000 20140000

  The decimal point is 7 digit(s) to the right of the |

  0 | 00000111333
  0 | 666
  1 |
  1 |
  2 | 000

このreadLines(file(\"stdin\"))とか長ったらしいけど何とかならないのかな...と思ったら、すぐ下に書いてました。標準入力を簡単に使うための-dオプションがあるらしいです。

The program can also be shortened like using the new -d option which reads from stdin and assigns to a data.frame named X.

なにそれめっちゃ便利...。ということで、上のワンライナーはこんなに短くなります。

ls -l /boot | awk '!/^total/ {print $5}' | r -de "print(summary(X[,1])); stem(X[,1])

これはもう危険シェル芸への応用を期待せずにはいられませんね。わくわく。

その他

SHEBANGにも使えるので、Rでコマンドラインツールがつくれます。オプションとかつけるにはdocopt.Rというのが便利らしいです。

気になること

とはいえ、Rではシェルのパイプとはそれほどうまくやり取りできない気がします。(あんまり詳しくないですけど...)。このへん↓に期待、という感じなんでしょうか。

RcppStreams: R Integration for Streamulus