ソースが指定されているときに、スクリプトが対話的に実行されているかどうかを確認するスクリプトが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
}
は
あなたはPythonの 'if __name__ == '__main __':'のようなものを探していますか? – r2evans
(あなたがPythonを話さない場合は、その参考文献の背景がいくつかあります:https://stackoverflow.com/questions/419163/what-does-if-name-main-do) – r2evans
はい!それは基本的に私が探しているのと同じ機能性(または類似の結果を得ることができるもの)です。 – Brandon