main.do
是:
foreach mode in mode1 mode2 {
do run.do
}
和run.do
是:
foreach y in y1 y2{
reg `y' x
outreg2 using `y'.xls, append ctitle(`mode')
}
它有outreg2
,所以它产生了一个txt输出。但是我发现列标题是空的意味着Stata无法获得mode
。
这意味着mode
中的main.do
循环未被run.do
继承。
如何让它继承?如果我可以选择是否继承它,那将是非常好的。
我尝试的是:
foreach mode in mode1 mode2 {
global mode `mode'
do run.do
}
和
foreach mode in mode1 mode2 {
local mode `mode'
do run.do
}
和
foreach mode in mode1 mode2 {
global mode "`mode'"
do run.do
}
但没有任何作用。
答案 0 :(得分:2)
本地宏是......本地的。意思是仅在do-file编辑器窗口中的相同交互式会话,程序,do-file或(chunk)代码中可见。
Globals是一种粗糙的解决方案,可以在任何地方显示内容,但您必须使用$
来引用它们。因此,在run.do
中,您需要
ctitle($mode)
将内容作为参数传递是一个更好的解决方案。
另请参阅include
的帮助。
所有这些都是完全基本的Stata编程。为了成为Stata程序员的能力,最小参考是https://www.stata.com/manuals/u18.pdf,它也与您系统上的Stata捆绑在一起(除非您的版本已过期数年)。
答案 1 :(得分:1)
以下代码段在您的示例中展示了@Nick的出色建议。
run.do
以调用全局宏而不是局部宏:foreach mode in mode1 mode2 {
global mode `mode'
do run.do
}
foreach y in y1 y2 {
reg `y' x
outreg2 using `y'.xls, append ctitle($mode)
}
macro drop mode
run.do
转换为程序,并将本地宏mode
作为参数传递:program define foo
foreach y in y1 y2{
reg `y' x
outreg2 using `y'.xls, append ctitle(`1')
}
end
foreach mode in mode1 mode2 {
foo `mode'
}
include
中的文件run.do
main.do
照原样foreach mode in mode1 mode2 {
include run.do
}
最后一种方法更接近您正在寻找的“继承”解决方案。