2013-02-12 249 views
3

當我啓動一個do-file文件以恢復do-file作爲變量的路徑時,有可能嗎?在Stata中執行文件的路徑

我與合作作者(通過Dropbox)分享項目。因此,文件夾(數據,日誌等)的結構在雙方都是相同的。

但文件夾位於我的合着者的文件系統和我的不同。因此,編寫對文件夾路徑不可知的do-file會很有幫助。

我們希望我們項目的路徑不被硬編碼。

謝謝!

回答

4

你可以在這片領土的各種事情,包括

  • 傳遞一個目錄的名稱一個做文件作爲參數。例如,

    do mydo d:/myproject/data1812 
    

    啓動文件​​並傳遞一個特定目錄的DO-文件的說法。該做的文件裏面,你可以抓住的參數作爲

    local myfolder "`1'" 
    

    即通過本地宏1.傳遞的東西(任何其他參數將本地宏2,3等)

  • 製作確保您通常對位置的引用以及特定的文件在do-file中是相對的,並從父目錄運行do-file。

  • 在主do-file內使用全局宏來定位位置,然後在首先運行的主do-file內重新定義它們。

注意:最好使用正斜槓,即使在Windows下也是如此; Stata將翻譯。另外,如果有嵌入空格,則用雙引號將整個事物綁定在一起。

do mydo "d:/my project/data1812" 

第二種似乎最接近您的偏好,因爲沒有在特定位置佈線。但如果你使用的文件來自不同的地方,你必須告訴Stata他們在哪裏......

+0

是的,我認爲那是我的偏好。但是,我將如何指定工作目錄而不對它進行硬編碼?無論如何,Stata可以從do-file的位置推斷出它嗎? – Peutch 2013-02-12 16:42:19

+0

我總是執行以下兩件事之一:在與數據相同的目錄中運行do-file,或在do文件中指定數據所在的位置。我很困惑,你似乎在思考不同的東西:那可能是什麼?當前目錄可以以c(pwd)的形式訪問。查看'creturn list'的結果。沒有指定它在哪裏運行的do-file必須位於當前目錄中。這是否回答了這個問題? – 2013-02-12 19:20:57

4

尼克的評論上面給出了答案:c(pwd)。這爲後續命令提供了一個相對的起點,例如在data文件夾中打開一個數據集:

use `c(pwd)'/data/yourdata, clear 

你的問題可能是雙擊一個做文件不會導致Stata的工作目錄設置爲它的文件夾(而它爲數據集,這是不一致的,不一定有幫助)。

除了在您的Stata應用程序文件夾中通過profile.do文件在啓動時將您的項目文件夾路徑寫入全局宏集,沒有特別的解決方案。

我教學生的班級,讓他們用這樣的系統設置他們的工作目錄。它工作正常。

+1

如果'c(pwd)'是所尋求的答案,我很高興,但是Stata會理解例如'使用data/yourdata,清除',我不明白什麼因爲不知道而錯過了。我只用過'c(pwd)'作其他用途。我不會通過雙擊一個do-file來啓動Stata--它首先假設的操作系統設置太多 - 但因此與Fr一致。認定這是有問題的。 Peutch沒有指定正在使用的操作系統,這可能會影響解決方案。 – 2013-02-13 09:13:28

1

Paths to do-file in Stata

幾年已經過去了,但答案還是一樣:沒有直接的方法來確定當前的DO-文件的位置。關於這個話題的討論已經在統計專家中多次提出。你可以找到很多有用的技巧在這裏(只是一個簡要介紹,更多的討論在Statalist):

除了那些和尼克·考克斯和神父。答案,我提出了我在Stata協作工作中的簡單解決方案(可在Windows和Linux上的不同機器上工作)。它不需要額外的模塊,只取決於您如何整理文件夾中的材料。

提示1。 CD與暗示-cap-和你的工作目錄保持-cd-代碼在一個做文件的開頭:

cap cd "W:\Bonds\"             //Collaborator 1 
cap cd "C:\Users\StataUser\Desktop\ProjectForBonds\"    //Collaborator 2 
cap cd "/media/DATA/work_materials/Dropbox/MyProjects/Bonds/"  //Collaborator 3: Linux machine 
cap cd "D:/work_materials/Dropbox/MyProjects/Bonds/"    //Collaborator 3: PC 
cap cd "E:/Projects/Dropbox/MyProjects/Bonds/"      //Collaborator 3: Laptop 

-cap-如果目錄不存在迴避可能出現的錯誤,所以每一個用戶都將得到到他自己的項目工作目錄。 -ING-CD到該目錄後,您可以保存路徑爲全局變量,並在代碼進一步使用它(如果必要):

global cdpath = "`c(pwd)'" 
di "$cdpath"         //show current folder 
di `"{browse `"$cdpath"':Current folder}"'  //optional: click to open the folder in the explorer 

提示:尼克·考克斯提到的,使用「/ 「 代替 」\」。當您將「\」與全局/本地變量結合使用時,Stata會將其視爲與換碼符號的組合(爲了能夠在字符串中使用象'和$「之類的符號),所以使用」\「可能會破壞您的瀏覽策略。通過這個代碼檢查:

global cdpath = "`c(pwd)'" 
di "$cdpath" 
local i = 1 
cap noi use "$cdpath\`i'\auto", clear 
cap noi use "$cdpath/`i'/auto", clear 

提示2。保持相同的文件夾結構由內塔塔創建目錄:

cap mkdir "./Temp" 
cap mkdir "./Graphs" 

"."意味着當前工作目錄。所以你在工作目錄裏創建「Temp」和「Graphs」文件夾。在那裏您可以存儲臨時數據集,放置圖表等。 如果存在目錄,則不必擔心:-cap-可緩解此問題。

提示3。當保存/打開/刪除文件(數據,圖表,日誌等)明確告訴Stata的使用相對路徑:

use "./SourceData", clear 
graph export "./Graphs/RollingBond.png", as(png) replace 
save "./Temp/Years.dta", replace 
save "./FinalBond.dta", replace 
cap erase "./Temp/Years.dta" 

塔塔會知道你仍然在你的根文件夾和工作相對於該文件夾。 當然,你可以寫完整路徑是這樣的:

save "$cdpath/Temp/FinalBond.dta", replace 

這些技巧在Windows和Unix的工作,只需要編寫一個新用戶的-cap cd "..."-。當您或您的協作者從拇指驅動器工作並且無法訪問計算機上的任何其他位置時非常有用。