0

質問:

私はGNU Makeが初めてです。プログラムで統計データセットを sas7bdat から csv ファイルに変換し、GNU Make を使用してそれらを相互に同期させて、再現可能な研究を促進するより良い方法はありますか? コーディングの観点から、この問題に別の方法でアプローチしますか?それとも、再現可能な研究を促進するためのより良い方法はありますか? statTransferOptions.txt静的パターン ルールを使用しているときに、前提条件 (つまり ) を追加できますか?

ソリューションには次のことが必要です。

  • すべてのサブディレクトリにあるすべての sas7bdat ファイルを検索します
  • statTransfer オプションの読み取り
  • オプション付きの statTransfer コマンド ライン ツールを使用して、sas7bdat ファイルを csv ファイルに変換します。
  • statTransfer の現在の制限を考えると、これには 2 段階のプロセスが必要になると思います。
    • SAS データ ファイル ( .sas7bdat)ごとにstatTransfer コマンド ファイル ( .stcmd) を作成します。
    • stcmd ファイルのオプションを使用して statTransfer (st) を実行し、各 stcmd ファイルの csv ファイルを作成します。
    • ターゲット stcmd および csv ファイルは、前提条件の sas7bdat ファイルと同じサブディレクトリに存在する必要があります
    • 古い stcmd ファイルと csv ファイルを見つけて、新しい sas7bdat ファイルが存在する場合、または基本オプション ファイルが変更された場合にそれらを更新します。

環境:

私は、毎年発行される大規模な統計レポートを継承しています。以前は、分析は SAS で行われていました。現在、R を使用しています。SAS Enterprise Guide によって生成された sas7bdat ファイルの一部は、 sas7bdat パッケージでは正しくインポートされません。商用製品である StatTransfer にはコマンドライン インターフェイスがあり、sas7bdat ファイルを csv ファイルに適切に変換します。ただし、変換を改善するオプションがあります (たとえば、日付形式の書き込み)。sas7bdat ファイルは、データセットのタイプと年に対応する複数のサブディレクトリにあります。

このアプローチは、次のことによってさらに促進されました。

Gandrud、クリストファー (2013-06-21)。R および RStudio を使用した再現可能な研究 (Chapman & Hall/CRC The R Series) (pp. 104-105)。チャップマンとホール/CRC。キンドル版。

トラブルシューティング:

推奨メイクファイル?

RDIR := .

######
#PREP#
######
# Use BASH shell to create list of source sas7bdat files
SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')

# Use pattern substring functions to define variable list of filenames
# to be used as targets in recipes
STCMD_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))

#########
#TARGETS#
#########

all: $(STCMD_OUT) $(CSV_OUT)

# I think the name "static pattern rules" is misleading
# but I found this to be helpful:
# http://www.gnu.org/software/make/manual/make.html#Static-Pattern

# can I add statTransferOptions.txt as a pre-requisite while using static pattern rules?

$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat
    cp $(RDIR)/statTransferOptions.txt $@
    echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v >> $@
    echo quit >> $@

$(CSV_OUT): $(RDIR)/$(@D)/%.csv: $(RDIR)/$(@D)/%.stcmd
    st $(RDIR)/$<

clean:
    rm $(STCMD_OUT)
    rm $(CSV_OUT)

SO からの入力後に修正された Makefile:

RDIR := .

######
#PREP#
######
# Create list of source sas7bdat files
SASDATA := $(shell find $(RDIR) -type f -name '*.sas7bdat')

STCMD_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))

#########
#TARGETS#
#########

all: $(STCMD_OUT) $(CSV_OUT)

$(STCMD_OUT): %.stcmd: %.sas7bdat statTransferOptions.txt
    cp $(RDIR)/statTransferOptions.txt $@
    echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v -y >> $@
    echo quit >> $@

$(CSV_OUT): %.csv: %.stcmd
    st $(RDIR)/$<

clean:
    rm $(STCMD_OUT)
    rm $(CSV_OUT)

ただし、独自の statTransfer を呼び出すのではなく、ツールチェーン全体を使用できるように CRAN sas7bdat パッケージをデバッグするのが正しいオプションである可能性があります。

4

1 に答える 1

2

SO では、通常、関連する論文、オプション、代替案などを読みに行く時間やエネルギー (または多くの場合、興味) がありません。問題のあるコードを単純かつ明確に指定すると、最も効果的です (ケース、提供されているメイクファイルは素晴らしいです)、エラーメッセージまたは誤った出力を含む正確な問題(これはあなたの質問からは明らかではありません)、発生したかったが発生しなかったこと、これは常に明確であるとは限らないため、そしておそらく、あなたが試みたがうまくいかなかった追加の考えや方向性.

何が問題なのか正確にはわかりませんが、makefile にいくつかの問題が見られます。まず、これは機能しますが、非常に非効率的です。

SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')

:=ここでは、割り当ての形式を使用する必要があります。それほど重要ではありませんが、おそらく設定時にも使用する必要がありますSTCMD_OUTCSV_OUT

ただし、最も重要なのは、これらのルールが正しくないことです。

$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat

$@ターゲット リストまたは前提条件リストで (またはその代替形式のいずれか) のような自動変数を使用することはできません。自動変数は、ルールのレシピ内でのみ定義されます。これには二次拡張を使用できますが、なぜこれを行おうとしているのかわかりません。なぜ使用しないのですか:

$(STCMD_OUT): %.stcmd: %.sas7bdat

? 他の静的パターン ルールについても同様ですか?

statTransferOptions.txtあなたの質問については、はい、静的パターン ルールなどの追加の前提条件を追加してもまったく問題ありません。

于 2013-12-16T17:33:01.910 に答える