• capture

doファイルを回しているときに作業とは関係がない箇所でerrorが出て作業が中断されて困った経験があるので探してみたら,captureコマンドが便利そう。
例えばすでにlogファイルを開いているのに,それに気づかずdoファイルを回していて,途中のlog usingの箇所でエラーがでたり,
doファイルの一部を回していて,そのなかのgenerateコマンドの箇所で,すでにその変数は定義されています,とエラーがでるなど。。(こんな間抜けなのは僕だけ?)

captureコマンドは,アウトプットを無視して先に進むコマンドです。上の例で言うとlog usingを

capture log close
log using hogehoge

とすることで,問答無用で先に進むことができます。capture無しですと,logファイルが開かれていない場合は1行目でdoファイルが中断されますが,captureコマンドをつけることにより,logファイルが開かれていない場合もエラーが出ずに2行目以降に進みます。

また何度も部分的にやり直したいdoファイルあたりのgenerate分は

capture drop moge
gen moge = .

などとすることで幸せになれます。

  • levelsof

ある変数に含まれる要素の一覧を入手できます。あまり用途が思いつかないですが,local変数なんかと組み合わせると,例えば

sysuse auto, clear
levelsof rep78
local n = r(levels)

foreach hoge of local n{
	dis `hoge'
}

のように各要素ごとに処理をすることなんかも可能です。まぁ上の例も芸がないですが。。

変数がstringの場合には,ダブル・クォーテーションで要素を囲みますが,cleanオプションで外すことができます。