2017-01-18 7 views
0

私はデータの操作と評価を含む長いスクリプトを持っています。私はパラメータのセットを使用するようにセットアップしていますが、このスクリプトを関数のような種類の入力セットで複数回実行できるようにしたいと考えています。Rスクリプトとしての機能

スクリプトを実行するとプロットが生成され、見積もりがcsvに保存されますが、特に作成するオブジェクトには関係しません。

対話的に使用されるため、スクリプトを関数にラップすることはありません。 このようなことを人々はどうやってやりますか?

私は、コマンドライン引数については、この発見:How to pass command-line arguments when source() an R fileをまだ私が前に類似した何かを扱ってきた対話式問題

+0

私はそれを関数にすることが「対話的に使う」ことができないことを理解するのに苦労しています。 – joran

+0

私は時々、私はブラウザを使ってできる行ごとにスクリプトを実行したいのですが、最適ではありません... –

+0

それから私はそれを関数にすることをお勧めします。それをチャンクで実行するには、パラメータを設定し、チャンクによって関数チャンクの内容を実行します。ブラウザに機能を追加するには、ブラウザをもう一度起動して実行します。 – Hansi

答えて

0

を解決しません。以下は私が思いついた解決策です。 私は基本的にlist2envを使用して変数をグローバルまたは関数のローカル環境 にプッシュし、次に指定された環境の関数sourceをプッシュします。

これは、スクリプトをスタンドアロンに保つことができる以下の例に示すように、特にexistsと組み合わせて使用​​すると非常に便利です。

これら二つの質問にも助けになることがあります。基本パッケージで Source-ing an .R script within a function and passing a variable through (RODBC) How to pass command-line arguments when source() an R file

# Function ---------------------------------------------------------------- 
subroutine <- function(file, param = list(), local = TRUE, ...) { 
    list2env(param, envir = if (local) environment() else globalenv()) 
    source(file, local = local, ...) 
} 


# Example ----------------------------------------------------------------- 
# Create an example script 
tmp <- "test_subroutine.R" 
cat("if (!exists('msg')) msg <- 'no argument provided'; print(msg)", file = tmp) 

# Example of using exists in the script to keep it stand-alone 
subroutine(tmp) 

# Evaluate in functions environment 
subroutine(tmp, list(msg = "use function's environment"), local = TRUE) 
exists("msg", envir = globalenv()) # FALSE 

# Evaluate in global environment 
subroutine(tmp, list(msg = "use global environment"), local = FALSE) 
exists("msg", envir = globalenv()) # TRUE 

unlink(tmp) 
-1

?commandArgsを確認し、コマンドラインから引数を解析するためにこれを使用することができます。

私は、コードを含むスクリプト、test.R、持っている場合:

args <- commandArgs(trailingOnly=TRUE) 

for (arg in args){ 
    print(arg) 
} 

を、次のように私はrscriptでコマンドラインからそれを呼び出す:

rscript test.R arg1 arg2 arg3 

出力は次のとおりです。

[1] "arg1" 
[1] "arg2" 
[1] "arg3"