2013-02-12 250 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 "..."-。当您或您的协作者从拇指驱动器工作并且无法访问计算机上的任何其他位置时非常有用。