2017-12-21 14 views
2

ソースが指定されているときに、スクリプトが対話的に実行されているかどうかを確認するスクリプトがinteractive()です。対話形式で実行されている場合、コマンドライン引数は検索されません。ただし、対話形式で実行されていない場合は、コマンドライン引数を検索してエラーをスローします。Rscriptは、Rスクリプトが別のスクリプトから呼び出されているかどうかを検出します。

これは正常ですが、一部のデータを処理するために単独で実行したい2番目のRスクリプトを書き込むことがあります。 Script2はScript1をソースし、Script1は対話的に実行されていないことを検出し、コマンドライン引数の検索とエラーのスローを開始します。

interactive()のほかに、スクリプトがそのコンテキストを検出できる方法はありますか?たとえば、直接実行されているときと、内部関数の1つにアクセスするためにロードされているときに別々の動作が必要な場合があります。パッケージでは、dplyr::arrange()のような何かを実行して、にアクセスすることができ、dplyrをすべてロードする必要はありません。

EDIT:私の現在の非常にjankyこの問題を回避するには、対話型のセッションを開始するソースSCRIPT1、機能を保存するためにsave.image()を使用して、スクリプト2で保存した.RDataファイルをロードするためにloadを使用することでした。しかし、明らかにこれはエレガントではありません。


私が使用し、正確なコードは、関連するが、それを含め、誰かがこの答えに重要であると感じる場合には...

は、サンプルコードストリップダウンということではないと思います。

#!/usr/bin/env Rscript 

library(optparse) 

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if(!interactive()) { 

    # example call 
    # Rscript create_reference_file.R -c cd4cd8 -o /home/outputfolder/ 

    option_list = list(
     make_option(c('-c', '--cell'), type = 'character', default = NULL, 
        help = 'the name of the cell', 
        metavar = 'character'), 
     make_option(c('-o','--outdir'), type = 'character', default = NULL, 
        help = 'the location where you wish to store your output', 
        metavar = 'character'), 
    ) 

    opt_parser <- OptionParser(option_list = option_list) 
    opt <- parse_args(opt_parser) 

    function1(opt); function2(opt) # etc etc, I do stuff with the opt inputs 
} 
+1

あなたはPythonの 'if __name__ == '__main __':'のようなものを探していますか? – r2evans

+0

(あなたがPythonを話さない場合は、その参考文献の背景がいくつかあります:https://stackoverflow.com/questions/419163/what-does-if-name-main-do) – r2evans

+0

はい!それは基本的に私が探しているのと同じ機能性(または類似の結果を得ることができるもの)です。 – Brandon

答えて

1

私はそれはあなたの回避策よりもわずかに小さいjankyだ...ハックとして、これを捨てるだろうが、それはスクリプトKNOをINGのコールに依存しています何かの翼の何かをedスクリプトがテストされています。

スクリプトをINGのコールが変数を設定した場合:

BEING_SOURCED_FROM_SOMEWHERE <- TRUE 

その後、コールスクリプトは、それをチェックすることができます

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if (! exists("BEING_SOURCED_FROM_SOMEWHERE")) { 
    library(optparse) 
    # ... 
} 

私はそれを好きではありません。これは、Pythonの

if __name__ == "__main__": 
    import optparse 
    # ... 

ほど柔軟ではありません。しかし、私は関数定義のsaveloadの使用よりも少ないことを嫌いだと思います。

EDIT

わかりましたが、これは多くのPythonの__name__トリックのようなものです。

function1 <- function(etc,etc) {} 
function2 <- function(etc,etc) {} 

if (sys.nframe() == 0L) { 
    library(optparse) 
    # ... 
} 

それは一つの希望でしたようミニマリストとして、それについて何を知っているsource INGのスクリプトを必要としない程度であり、ネストされた場合でもうまく動作するようです。

Rscript: Determine path of the executing scriptごとに、スクリプト名を見れば、他の可能なメカニズムを使用できます(追加機能が必要です)。多くのもっともらしい(いくつかの実際に良い)ソリューションが存在しますが、それらはすべて基本パッケージ(またはソースに含まれるスクリプトに含まれている簡単なコード)で定義されていない事前定義された関数を必要とします。あなたが "パッケージXがインストールされていると仮定したい"場合、あなたのスクリプトは潜在的に移植不可能になります。

+0

ところで、あなたの元の質問*シチュー*をちょっと見て、他の人がより洗練された解決策を持っているかどうかを気軽に聞かせてください。あなたがそれをあまりにも早く受け入れるならば、他の回答者は質問を読むことさえも避けるかもしれません。 :-) – r2evans

+0

おそらく@DirkEddelbuettelに['littler'](http://dirk.eddelbuettel.com/code/littler.html)ユーティリティの中に何かがありますか? – r2evans

+0

これは完璧ではありませんが、私が以前に試していたものに比べて正しい方向への大きなステップです。 – Brandon

関連する問題