Rでスクリプトを書く際に、CやJavaでのようにメイン関数を書きたいとします。
即ち、スクリプトの冒頭にメイン関数を配置し、その下にサブ関数を並べるというお馴染みの書き方をしたい。
結論から言えば、下記のように書けばOKです。
# Main function main = function(){ subFunctionA() subFunctionB() } # Sub functions subFunctionA = function(){ print("Hello, my name is Alex.") } subFunctionB = function(){ print("Hi, my name is Barbara.") } # Execute main function main()
当たり前じゃんって感じですし、話はこれで終わりです。
が、この結論に至るまでに多少の試行錯誤があったので、その話もついでに書いておきます。
所期の目的を実現するために、最初は下記のようなコードを書きました(そしてエラーとなった)。
# Main function (main = function(){ subFunctionA() subFunctionB() })() # Sub functios subFunctionA = function(){ print("Hello, my name is Alex.") } subFunctionB = function(){ print("Hi, my name is Barbara.") }
メイン関数を即時関数(その場ですぐ実行される関数)として書いています。手短に書くならこれが自然に思えます。例えばJavaScriptならこの書き方でOKだったような。でも、Rスクリプトの場合、メイン関数の実行時点でサブ関数が未定義であるという理由で、このスクリプトはエラーを起こします。
順番を入れ替えてメイン関数の前にサブ関数を書けば、もちろんうまく動きます。
# Sub functios subFunctionA = function(){ print("Hello, my name is Alex.") } subFunctionB = function(){ print("Hi, my name is Barbara.") } # Main function (main = function(){ subFunctionA() subFunctionB() })()
動くけど、メイン関数を頭に書きたいわけで、これは私たちの求めているものではありません。
そこで、即時関数を使うのはやめて、メイン関数は普通に関数として定義しておき、スクリプトの末尾にこれを実行する文を入れておけば、「メイン関数の次にサブ関数」という順序でスクリプトが書けます。
スクリプト末尾にメイン関数の実行文を入れるというのが間抜けな感じがしてどうにも嫌で、即時関数を使うなどしてなんとかそれを排除したかったのですが、仕様それはできないぽいので、仕方なく冒頭に書いたようなベタやり方に屈した、という話でした。
コメント