R の関数の引数の数を得る

args 関数を使うことで,関数の引数リストを取得することができます。

args(sqrt)

ここで得られる結果はクロージャオブジェクトなので, formals 関数により,リストオブジェクトにすることができます。

formals(args(sqrt))

リストなので, length 関数により引数の数を得ることができます[a]

length(formals(args(sqrt)))

これを用いて,例えば,特定の名前空間に存在するすべての関数の引数の数を取得したい場合は次のようにできます。

e <- asNamespace("stats")
exports <- sapply(ls(envir=e), get, envir=e)
functions <- exports[sapply(exports, is.function)]
sapply(functions, function(f) length(formals(args(f))))

結果は stats 名前空間に公開された関数の引数の個数の名前付きベクトルです。ジェネリック関数のように重複もありますが,これで引数の個数の分布を調べても面白いと思います。

脚注

  1. ただし, ... は 1 つの引数として扱われます。 []

Tip, プログラミング

Nemerle で Brainfuck をインラインで実行

前回は Nemerle で Brainfuck のパーサーを書いて普通に実行しました。今回は Nemerle の強力なマクロ機能を利用して,インラインで Brainfuck のソースコードを実行してみます。

Read more...

プログラミング ,

Nemerle で Brainfuck の PEG parser を作る

Nemerle には標準で PEG のパーサージェネレーターのライブラリが付属しています。それを使って Brainfuck の単純なパーサーを書いてみます。

Read more...

プログラミング, 雑感 , ,

イベント駆動で組み合わせを列挙する

組み合わせの列挙を行いたいということはしばしば起こります。例えば 0, 1, 2, 3, 4 の 5 つの数字から 3 つを取り出す組み合わせというのは {0, 1, 2}, {0, 1, 3}, {0, 1, 4}, {0, 2, 3}, {0, 2, 4}, {0, 3, 4}, {1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4} の 10 通りあります。普通に書く場合は『Using Combinations to Improve Your Software Test Case Generation』のように書けばよいのですが,ここではあえてイベントを利用して書いてみたいと思います。

Read more...

プログラミング

C# で enum を扱うメソッドってどう書くべきなのだろう

C# の enum を扱うメソッドをジェネリックに書きたいと思うと,ジェネリック型制約に enum が使えないという問題に直面します[a]。何通りか書き方が考えらます。これを,フラグの列挙型の値を与えると,フラグを分解して返すメソッド DecomposeFlag を書きながら考えて見ます。

[Flags]
enum Flag { None = 0, A = 1, B = 2, C = 3, D = 4, E = 5 }

// DecomposeFlag(Flag.None) -> { Flag.None }
// DecomposeFlag(Flag.A) -> { Flag.A }
// DecomposeFlag(Flag.C) -> { Flag.A, Flags.B }
// DecomposeFlag(Flag.C | Flag.E) -> { Flag.A, Flag.B, Flags.D }
// DecomposeFlag(Flag.None | Flag.E) -> { Flag.A, Flags.D }

Read more...

脚注

  1. delegate もそうですね。 []

プログラミング, 雑感 ,