2017-01-12 5 views
0

データを.csvファイル形式で出力するモデルがあります。出力ディレクトリには、それぞれがn.csvという名前の.csvファイルでいっぱいです.nは実行番号です。だから、Rの中で、.csvファイルを順番に返すクロージャーの問題

など、それはそれは1.csvを作成する第一の実行時に、0.csvを作成し、0番目の実行時に今私はRで、このデータを分析し、別のモデルの出力にそれを比較したいです。私は入力として関数として与えられた2つのモデルで私が望む分析を実行する関数を書いた。私はと比較してるモデルがビルド中のSNA機能であり、私のモデルは、私は、次の閉鎖を書いてシミュレート機能を作るために

#creates a model function that returns sequentially numbered .csv files from a directory 
make.model <- function(dir) { 
    i <- -1 # allows for starting the .csv ennumeration at 0 
    model <- function() { 
    i <<- i + 1 
    my.data <- as.matrix(read.csv(paste0(dir, i, ".csv"), header=FALSE)) 
    return(my.data) 
    } 
    return(model) 
} 

私はに実行しています問題があること

my.model <- make.model(directory) 
spectral.analysis(my.model, other.model, observed.data, nsim = 100) 
ものの

私が望むものを正確に実行し、観察されたデータをモデリングする際に私のモデルと他のモデルがどれほどうまくいくかを計算します。再利用はできません。クロージャー内のカウンターは常に最新の状態になっています。そのため、存在しない.csvファイルにアクセスしようとする前に、関数を何度も実行する必要があります。

私は現在my.modelを再定義し、私はmy.modelを使用するたびの後にそれを実行している、これは非常に悪い解決策のように思える機能を「リセット」してこの問題を回避取得しています。

これを行うにはより洗練された方法がありますか?重要なのは、関数spectral.analysis()が関数を入力として受け取り、関数を実行してその値を取得し、その関数を書き直すことが現在テーブルにないことです。モデルを実行するには数時間かかるため、モデルから分析関数にデータを直接渡すわけではありません。そのため、多くの試行を事前に実行して後で分析できるようにしたいと考えています。

+1

てみI = I +の代わりに、iの1 << - 優先 - 私は、 "=" 変数の割り当てのためにRで悪いスタイルと考えられている使用して、 "<" という印象の下だ – akaDrHouse

+0

@akaDrHouse。いずれにせよ、それをすることは機能しません。 "< - "または "="のいずれかを使用すると、インクリメントが現在の実行の範囲外にならないため、関数は実行されるたびに0.csvを参照します。 –

+1

グローバル割り当ての使用は広く考えられています*悪い習慣*。コードがどのように動作し、どのように物事を構築するかが変わります。 '< - ' vs '='は*スタイルの設定です* 1つか2つの非常にまれなケースを除き、あなたのコードが何をするかは変わりません。 – Gregor

答えて

0

自己回答に近いので、私はコメントの助けを借りてそれを理解しました。

length(list.files(pattern=".csv")) 

あなたはので、私は

i <<- (i + 1) %% length(list.files(pattern=".csv")) 

を読み取るために増加されている行を変更して問題を解決し、.CSVファイルの数を取得することができます。

関連する問題