質問:
私は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。キンドル版。
トラブルシューティング:
- これはほとんど私が望むことです: GNU make の再帰ワイルドカード?
推奨メイクファイル?
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 パッケージをデバッグするのが正しいオプションである可能性があります。