Stata + Boss Ox's Framework = Easy Life

本文介紹一個由我操刀設(shè)計的 Stata 框架卤恳,簡單安裝一下即可大幅提高工作效率秸歧,解決 Stata 移動版經(jīng)常遇到的麻煩灾锯。文末附下載鏈接。


Profile.do

Stata 在啟動的時候會自動以 run 的模式運行與程序放在同一文件夾下的 profile.do 文件(如果有)贞铣,用戶可以將很多個性化的設(shè)置寫在里面闹啦,使 Stata 符合自己的使用習慣,工作起來得心應(yīng)手辕坝。以個人觀察和周圍同行的情況來看,大多數(shù)人不知道這樣一個功能荐健,即便知道也很少有人將其充分利用起來酱畅。

如果充分利用 profile.do 能給我們帶來什么便利呢?那要看在沒有這個文件的情況下江场,使用 Stata 都存在哪些痛點纺酸。例如:

  1. Stata 的命令包都在 Ado 文件夾下,但綠色版的程序卻視 PLUS 和 PERSONAL 文件夾而不見址否,將這兩個系統(tǒng)文件夾定位到 C 盤去(Windows 下)餐蔬,導(dǎo)致程序在分享的過程中經(jīng)常找不到已經(jīng)安裝的擴展命令。

  2. Stata 啟動后不會自動記錄日志佑附,每次都需要手動打開樊诺。偶爾出現(xiàn)什么問題要頻繁關(guān)閉 Stata 時,會忘記繼續(xù)記錄日志音同,導(dǎo)致事后查詢?nèi)罩緯r兩手空空词爬。

  3. 同時進行幾個項目時,每次啟動 Stata 之后权均,都需要將當前工作目錄導(dǎo)航至電腦上其他某個地方顿膨,這個過程往往十分繁瑣(例如將不同項目放在不同文件夾,數(shù)據(jù)文件又放在其他什么地方)叽赊,讓人頭疼恋沃。

  4. 工作告一段落,第二天繼續(xù)進行的時候忘記自己做到哪里了必指。找個記事本記錄一下還要單獨打開很麻煩囊咏。

  5. 想編輯一下 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)了以下功能:

  1. 將 PLUS 和 PERSONAL 文件夾酝掩,設(shè)定在 Stata 相對目錄 Ado 文件夾下。
    這樣眷柔,在移動 Stata 或者將 Stata 拷貝至其他地方時期虾,已經(jīng)安裝的擴展命令會跟隨移動原朝,并自動被 Stata 識別,解決了更換 Stata 位置后镶苞,無法找到擴展命令的問題喳坠,使 Stata 可以裝進 U 盤里移動使用。

  2. 自動記錄日志(Log)和命令日志(CmdLog)茂蚓。
    每次啟動 Stata 時以時間為名稱保存這兩個記錄壕鹉,并且從不自動刪除,所以可以徹底忘記要時刻保存日志的事情了聋涨,想要查詢的時候直接回去翻看文件夾就好御板。
    有一個 BUG:macOS 下啟動時設(shè)定日志的話,日志記錄狀態(tài)會在程序中顯示出來牛郑,但是 Windows 下是無法顯示的。這會給人一種錯覺敬鬓,認為 Stata 并沒有在記錄日志淹朋。但其實用 log 命令去檢驗的話,會發(fā)現(xiàn)日志記錄千真萬確是打開著的钉答。習慣就好础芍。

  3. 建立了 QuickStart 文件夾體系。
    這是干什么的数尿?用于多項目管理仑性。舉例來說,一個用戶近三個月來同時作者三個項目右蹦,項目的主要文件分別存放在了 D:\StataProjects1诊杆、E:\temp\pro2F:\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)容输涕。

  4. 提供一個全局記事本(Notes.txt)。
    可以直接在 Stata 中查看記事本的內(nèi)容慨畸,然后通過 Stata 命令來打開這個文本文件進行編輯莱坎。可以當做 Todo 或者 Memo寸士。
    這個東西是當年我要做的事情太多太瑣碎了檐什,常常記不清上次做了什么該做什么,而設(shè)計的弱卡。當時是針對于一個項目而言的乃正,在加載完 QuickStart 里的快捷方式之后顯示這個記事本,現(xiàn)在拿來當做一個全局性的功能來用婶博。

  5. 快速編輯 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's Framework Windows 版加載效果圖

圖中所示信息的一些解釋:

  • 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),這里存放著框架所處理的全部文件哈恰。

框架所生成的文件結(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):百度云盤

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挠锥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侨赡,更是在濱河造成了極大的恐慌蓖租,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羊壹,死亡現(xiàn)場離奇詭異蓖宦,居然都是意外死亡,警方通過查閱死者的電腦和手機油猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門稠茂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人情妖,你說我怎么就攤上這事睬关。” “怎么了毡证?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵电爹,是天一觀的道長。 經(jīng)常有香客問我料睛,道長丐箩,這世上最難降的妖魔是什么摇邦? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮雏蛮,結(jié)果婚禮上涎嚼,老公的妹妹穿的比我還像新娘。我一直安慰自己挑秉,他們只是感情好法梯,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犀概,像睡著了一般立哑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姻灶,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天铛绰,我揣著相機與錄音,去河邊找鬼产喉。 笑死捂掰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的曾沈。 我是一名探鬼主播这嚣,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塞俱!你這毒婦竟也來了姐帚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤障涯,失蹤者是張志新(化名)和其女友劉穎罐旗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唯蝶,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡九秀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粘我。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓蜒。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涂滴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情晴音,我是刑警寧澤柔纵,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站锤躁,受9級特大地震影響搁料,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一郭计、第九天 我趴在偏房一處隱蔽的房頂上張望霸琴。 院中可真熱鬧,春花似錦昭伸、人聲如沸梧乘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽选调。三九已至,卻和暖如春灵份,著一層夾襖步出監(jiān)牢的瞬間仁堪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工填渠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弦聂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓氛什,卻偏偏與公主長得像莺葫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屉更,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理徙融,服務(wù)發(fā)現(xiàn),斷路器瑰谜,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 12,149評論 2 34
  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言渤早,發(fā)作 oo-boon-too 的音职车。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,217評論 9 467
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息) 1鹊杖、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,074評論 1 19
  • 大部分的“害怕”是建立在擔心失去某些東西的基礎(chǔ)上悴灵,二十出頭的我們一無所有,還怕失去什么骂蓖?所以积瞒,什么都別怕,只需向前...
    鐘那個誰閱讀 177評論 0 0