本文介紹一個由我操刀設(shè)計的 Stata 框架卤恳,簡單安裝一下即可大幅提高工作效率秸歧,解決 Stata 移動版經(jīng)常遇到的麻煩灾锯。文末附下載鏈接。
Profile.do
Stata 在啟動的時候會自動以 run 的模式運行與程序放在同一文件夾下的 profile.do 文件(如果有)贞铣,用戶可以將很多個性化的設(shè)置寫在里面闹啦,使 Stata 符合自己的使用習慣,工作起來得心應(yīng)手辕坝。以個人觀察和周圍同行的情況來看,大多數(shù)人不知道這樣一個功能荐健,即便知道也很少有人將其充分利用起來酱畅。
如果充分利用 profile.do 能給我們帶來什么便利呢?那要看在沒有這個文件的情況下江场,使用 Stata 都存在哪些痛點纺酸。例如:
Stata 的命令包都在 Ado 文件夾下,但綠色版的程序卻視 PLUS 和 PERSONAL 文件夾而不見址否,將這兩個系統(tǒng)文件夾定位到 C 盤去(Windows 下)餐蔬,導(dǎo)致程序在分享的過程中經(jīng)常找不到已經(jīng)安裝的擴展命令。
Stata 啟動后不會自動記錄日志佑附,每次都需要手動打開樊诺。偶爾出現(xiàn)什么問題要頻繁關(guān)閉 Stata 時,會忘記繼續(xù)記錄日志音同,導(dǎo)致事后查詢?nèi)罩緯r兩手空空词爬。
同時進行幾個項目時,每次啟動 Stata 之后权均,都需要將當前工作目錄導(dǎo)航至電腦上其他某個地方顿膨,這個過程往往十分繁瑣(例如將不同項目放在不同文件夾,數(shù)據(jù)文件又放在其他什么地方)叽赊,讓人頭疼恋沃。
工作告一段落,第二天繼續(xù)進行的時候忘記自己做到哪里了必指。找個記事本記錄一下還要單獨打開很麻煩囊咏。
想編輯一下 profile.do 但是要找到這個文件很麻煩(在已經(jīng)使用 profile.do 的情況下)。
這些問題的解決都可以通過合理編寫 profile.do 來實現(xiàn)取劫。
框架設(shè)計之源
我最早了解到 profile.do 是在中山大學(xué)副教授連玉君老師的 Stata 視頻課程里匆笤,連老師有一套自己的 profile.do 編輯習慣,包括修改 Stata 偏好谱邪、記錄日志炮捧、設(shè)定工作文件夾等。我將它運用到自己的使用中惦银,受益匪淺咆课,但同時也發(fā)現(xiàn)這套配置包含了許多個人特色末誓,并非對所有人都適用。
結(jié)合自己的工作經(jīng)驗书蚪,以及在編程方面的一些思路喇澡,我有了設(shè)計一套自己的工作環(huán)境的設(shè)想,如今付諸實踐殊校。暫時沒有想到好名字晴玖,將這個工作環(huán)境命名為“Boss Ox's Framework”,意為我的一套框架为流。這個框架將高度個性化的內(nèi)容剔除呕屎,保留必要的偏好設(shè)置,自動建立日志敬察,并提供了多項目管理的一個很好的思路秀睛。
目前這個框架已經(jīng)在我周圍的很多同學(xué)中進行推廣,并且在不斷的試用過程中莲祸,得到了修正蹂安、完善和增強。2018 年 3 月 9 日發(fā)布的這一版是可用性大幅度增強后公開發(fā)布的一版锐帜,應(yīng)該可以穩(wěn)定高效地提供工作環(huán)境支撐田盈。一些新的設(shè)想將會在后期逐步實現(xiàn)。
不過話說回來抹估,Stata 畢竟不是一個編程語言缠黍,只是腳本,沒法搞定所有天馬行空的構(gòu)想药蜻,現(xiàn)在實現(xiàn)某些功能就已經(jīng)挺費勁的了(參見 do 文件內(nèi)容)瓷式,后續(xù)升級也是要探索可行性的。
關(guān)于框架
所謂的這個框架语泽,起始也只是一個 do 文件贸典,用來實現(xiàn)自動化、簡易化踱卵、快捷化的輔助性功能廊驼。由于 macOS 和 Windows 系統(tǒng)的差異,這個 do 文件不能通用惋砂,故編寫了兩個版本妒挎,分別針對各自系統(tǒng)進行了優(yōu)化,命名為 “BOSSOX_Framework_macOS.do” 和 “BOSSOX_Framework_Windows.do”西饵。
這套框架自動實現(xiàn)了以下功能:
將 PLUS 和 PERSONAL 文件夾酝掩,設(shè)定在 Stata 相對目錄 Ado 文件夾下。
這樣眷柔,在移動 Stata 或者將 Stata 拷貝至其他地方時期虾,已經(jīng)安裝的擴展命令會跟隨移動原朝,并自動被 Stata 識別,解決了更換 Stata 位置后镶苞,無法找到擴展命令的問題喳坠,使 Stata 可以裝進 U 盤里移動使用。自動記錄日志(Log)和命令日志(CmdLog)茂蚓。
每次啟動 Stata 時以時間為名稱保存這兩個記錄壕鹉,并且從不自動刪除,所以可以徹底忘記要時刻保存日志的事情了聋涨,想要查詢的時候直接回去翻看文件夾就好御板。
有一個 BUG:macOS 下啟動時設(shè)定日志的話,日志記錄狀態(tài)會在程序中顯示出來牛郑,但是 Windows 下是無法顯示的。這會給人一種錯覺敬鬓,認為 Stata 并沒有在記錄日志淹朋。但其實用log
命令去檢驗的話,會發(fā)現(xiàn)日志記錄千真萬確是打開著的钉答。習慣就好础芍。建立了 QuickStart 文件夾體系。
這是干什么的数尿?用于多項目管理仑性。舉例來說,一個用戶近三個月來同時作者三個項目右蹦,項目的主要文件分別存放在了D:\StataProjects1
诊杆、E:\temp\pro2
和F:\SCI\final3
中。傳統(tǒng)情況下何陆,這個用戶打開 Stata 的第一件事就是:想一下今天要做的項目放在了哪里晨汹,然后用一串cd
命令將當前工作目錄(PWD)切過去。
有了 QuickStart 事情變得不一樣贷盲。這個用戶對于每一個進行中的項目淘这,都寫一個 do 文件放在這里,充當訪問這個項目的快捷方式巩剖。這個 do 文件中可以最少只寫一句話铝穷,即將目錄切換至這個項目所在的目錄,例如在 1.do 中寫cd D:\StataProjects1
佳魔,在 2.do 中寫cd E:\temp\pro2
曙聂,3.do 同理。
這個框架在初始化之后吃引,會自動將當前工作目錄切換至 QuickStart 文件夾筹陵,并在輸出中列出該文件夾下的所有 do 文件刽锤,從而可以直接以 do 或者 run 的方式運行 1.do 將目錄切換至第一個項目的主文件夾,2朦佩、3 同理并思。
如果某些大型的項目,在每次工作開始前都要進行一定的初始化設(shè)定的話(例如聲明幾個全局的 macro 來存儲一些經(jīng)常訪問的內(nèi)容)语稠,也可以將這些代碼寫在這個快捷方式 do 文件中宋彼,從而在切換至項目主文件夾的過程中,完成這些操作仙畦。
可以用 doedit 和 rm 命令來方便地管理 QuickStart 文件夾里的內(nèi)容输涕。提供一個全局記事本(Notes.txt)。
可以直接在 Stata 中查看記事本的內(nèi)容慨畸,然后通過 Stata 命令來打開這個文本文件進行編輯莱坎。可以當做 Todo 或者 Memo寸士。
這個東西是當年我要做的事情太多太瑣碎了檐什,常常記不清上次做了什么該做什么,而設(shè)計的弱卡。當時是針對于一個項目而言的乃正,在加載完 QuickStart 里的快捷方式之后顯示這個記事本,現(xiàn)在拿來當做一個全局性的功能來用婶博。快速編輯 profile.do 文件瓮具。
相對前文,這只是一個細枝末節(jié)了凡人∶常框架提供了一個命令來快速地打開 profile.do 文件,無論當前工作目錄是什么鬼地方划栓。
靈活使用這些工具可以使科研工作變得方便許多兑巾,省去很多煩惱。不過也有壞處——女朋友去找導(dǎo)師談?wù)撐姆较虻臅r候忠荞,在導(dǎo)師電腦上操作 Stata 就忘記了開啟日志記錄功能蒋歌,因為平常都是全自動的,沒這個習慣了哈哈委煤。
這個框架除了要求被放置于 Stata 文件夾堂油,并且在最后會將當前工作目錄切換至 QuickStart 外,與程序其他內(nèi)容沒有關(guān)聯(lián)碧绞,是高內(nèi)聚府框、低耦合的。用戶只需要在 profile.do 中增加或刪除一條命令讥邻,即可實現(xiàn)插件的安裝和卸載迫靖,這樣用戶無需對 profile.do 進行大的改動院峡,不會影響已經(jīng)自定義的其他功能。
使用說明
插件化的設(shè)計思路系宜,使得這個插件的安裝和卸載變得十分簡單照激。
A 安裝
- 復(fù)制框架 do 文件到 Stata 程序所在文件夾。
- 在這個文件夾里如果沒有 profile.do 的話盹牧,建立 profile.do俩垃,有的話對其進行編輯,根據(jù)所使用的操作系統(tǒng)汰寓,在 profile.do 中任意位置加入下方對應(yīng)的命令:
// Load Boss Ox's framework for macOS noisily run BOSSOX_Framework_macOS.do // Load Boss Ox's framework for Windows noisily run BOSSOX_Framework_Windows.do
如此簡單即完成了框架的安裝口柳,下次啟動 Stata 時,若除了在 Available QuickStarts 部分下有找不到文件的提示有滑,沒有其他錯誤提示跃闹,即為安裝成功。
注意:上文說在 profile.do 的任意位置添加命令毛好,是原則性的辣卒。實際上,因為框架初始化會依賴于 do 文件被調(diào)用時 Stata 的當前工作路徑睛榄,要求必須是 Stata 程序所在的位置,所以不能在 profile.do 中更改當前工作路徑的命令后面放置加載框架的命令想帅,除非在實際加載框架前场靴,當前工作路徑又被調(diào)整回初始值。
B 加載
框架安裝后港准,每次啟動 Stata 會看到如下圖所示的初始化界面旨剥。在 Windows 系統(tǒng)中,當 QuickStart 中沒有 do 文件時浅缸,Available QuickStarts 部分可能會提示無法找到文件的錯誤轨帜,這是正常現(xiàn)象衩椒。
圖中所示信息的一些解釋:
- BOSS OX 為作者信息蚌父,下方日期為版本號,Beijing 表示制作地點毛萌。
- Global Framework Commands 部分為框架命令苟弛,在命令窗口直接輸入如下所列的可用命令,回車即可執(zhí)行操作阁将。
- Available QuickStarts 部分列出了 QuickStart 文件夾下的所有 do 文件膏秫。由于框架會將當前工作目錄最終切換至 QuickStart 文件夾,所以可以直接 run 或者 do 這些 do 文件做盅,來實現(xiàn)快捷方式似的跳轉(zhuǎn)缤削。
- Notes 部分顯示 Notes.txt 的文本內(nèi)容窘哈。
C 命令
- $fw_profile:編輯 profile.do 文件。
- $fw_config:編輯 BOSSOX_Framework_macOS.do 文件(以 macOS 為例)亭敢。
- $fw_home:將當前工作目錄切回到 QuickStart 文件夾滚婉。
- $fw_autolog:顯示已有的自動日志(Log)。
- $fw_autocmdlog:顯示已有的自動命令日志(CmdLog)吨拗。
- $fw_clearlog:刪除全部自動日志(Windows:當前日志除外)满哪。
- $fw_clearcmdlog:刪除全部自動命令日志(Windows:當前日志除外)。
- $fw_note:顯示 Notes.txt 的文本內(nèi)容劝篷。
- $fw_editnote:用記事本編輯 Notes.txt 的內(nèi)容哨鸭。
- $fw_help:顯示框架可用的命令和說明。
- $fw_about:顯示框架的關(guān)于信息娇妓。
D 文件
加載框架之后像鸡,會生成下圖中 Framework 文件夾結(jié)構(gòu),這里存放著框架所處理的全部文件哈恰。
其中 AutoLog_CmdLog 存放命令日志只估,AutoLog_Log 存放日志,QuickStart 存放用戶編輯的充當快捷方式的 do 文件着绷,Notes.txt 是記事本文件蛔钙。
E 拆卸
- 刪除 BOSSOX_Framework_macOS.do 文件(以 macOS 為例)。
- 從 profile.do 中將先前安裝框架時添加的命令刪除荠医。
- 刪除 Stata 文件夾下的 Framework 文件夾吁脱,這是框架運行時生成的文件;如果不希望刪除日志和命令日志的話彬向,請?zhí)崆皩⑦@些東西備份出來兼贡。
技術(shù)細節(jié)
A 如何生成記事本?
我沒找到 Stata 里直接生成文本文件的命令娃胆,所以使用了一個曲線救國的辦法遍希。CmdLog
命令會生成一個文本文件,并且不強制指定擴展名里烦。與 Log
命令相比凿蒜,在不輸入任何命令的情況下,前者不會向文件中寫入任何內(nèi)容胁黑,所以文件為空篙程;而后者會把程序啟動時顯示的信息都囊括進去。所以實際上是用 CmdLog
命令來實現(xiàn)的别厘。
B 如何在暫元中保存引號虱饿?
用 help quote
命令可以查詢到 Stata 關(guān)于引用的說明,但官方的例證過于繁瑣了,不如 SSCC(Social Science Computing Cooperative)寫的這篇文章《Stata Programming Tools》更簡明扼要氮发。
簡單說渴肉,Stata 沒有轉(zhuǎn)義字符的概念,當傳統(tǒng)的雙引號不能表達一個內(nèi)容為雙引號的字符串時爽冕,可以使用復(fù)合雙引號來引用字符串仇祭,即 `"
和 "'
(反引號+雙引號,雙引號+單引號)颈畸。例如:
global test = `"""'
macro list test
輸出結(jié)果為一個雙引號 "
乌奇。
在復(fù)合雙引號中使用單引號會存在問題,所以需要靈活地和普通雙引號進行拆分和加和的配合眯娱,從而達到向暫元中存放復(fù)雜命令的問題礁苗,尤其是存放 display
命令的時候。
插播:怎樣用 Markdown 打出有反引號(`)的行內(nèi)代碼塊徙缴?
波浪線(~
试伙,Tilde)按鍵上的另一個符號,叫做 “反引號”于样。在 Markdown 語法中疏叨,用兩個反引號括起來的內(nèi)容被標記為行內(nèi)代碼塊。如果想在代碼塊中放置反引號穿剖,則需要增加用于標記開頭和結(jié)尾的反引號的對兒的數(shù)量蚤蔓,例如兩個:``there is a ` in the code block``
這段代碼的效果是:
there is a ` in the code block
。
但如果代碼中的反引號出現(xiàn)在開頭或結(jié)尾糊余,會影響轉(zhuǎn)碼的識別昌粤,所以需要在代碼首尾再額外添加一個空格:`` ` is at the beginning of the code block ``
這代代碼的效果是:
` is at the beginning of the code block
。
我是因為要用代碼塊打出復(fù)合雙引號才碰到的這個問題啄刹,現(xiàn)查了一下 Markdown 語法說明 中關(guān)于反引號(`)的使用規(guī)則。我原以為轉(zhuǎn)義字符反斜杠(\)是可以完成這個任務(wù)的凄贩,但遺憾的是在兩個反引號括起來的代碼塊中使用反斜杠來轉(zhuǎn)義中間的一個反引號行不通誓军。反斜杠也只能轉(zhuǎn)義有數(shù)的幾個特殊字符,這一點在語法說明的文末有介紹疲扎。
C 其他小點
- 使用 global macro 保存 Stata 命令和參數(shù)昵时,形式上作為用戶輸入的當做框架的命令。
- 使用了 C 級系統(tǒng)返回值椒丧。
下一步展望
如果研究生畢業(yè)之后還有機會經(jīng)常用到 Stata壹甥,或許我還會有動力繼續(xù)完善這個作品。其實現(xiàn)在就有進一步擴展這個框架的想法壶熏,只因為預(yù)計馬上畢業(yè)之后就再也不用句柠,所以就犯懶了。后續(xù)有可能根據(jù)用戶反饋進行微調(diào)和 BUG 修復(fù),大版本的更新就看心情了溯职,紅紅火火恍恍惚惚呵呵哈哈嘿嘿精盅!畢竟當前的設(shè)計還是存在一些弊端的,比如對文件名的高度依賴谜酒,以及會占用全局暫元等等叹俏。
簡單記一下未來的發(fā)展方向吧:
- 用 Program 充實當前功能。
- 區(qū)分針對框架的命令和框架下內(nèi)容的命令僻族,例如自動拆卸框架粘驰。
- 檢測框架所需的 macro 是否已經(jīng)被定義,若是述么,申請新名稱蝌数,避免沖突。
- 提供直接打開日志的命令和打開日志文件夾的命令碉输。
- 提供管理 QuickStart 文件夾內(nèi)容的命令籽前。
- 沒有 Notes.txt 的情況下,新建內(nèi)容為 “Hello World!” 的文件敷钾,打招呼枝哄。
……
歡迎廣大親朋好友來嘗試一下,并反饋給我阻荒。
下載地址(2018.03.09):百度云盤