Stata 继承循环变量或局部、全局宏

Stata 继承循环变量或局部、全局宏,stata,stata-macros,Stata,Stata Macros,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无法获得模式 这意味着main.do中的mode循环未被run.do继承 我怎样才能把它继承下来?如果我能选择是否继承它,

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无法获得
模式

这意味着
main.do
中的
mode
循环未被
run.do
继承

我怎样才能把它继承下来?如果我能选择是否继承它,那就太好了

我尝试的是:

foreach mode in mode1 mode2 {
global mode `mode'
do run.do
}
以及:

以及:


但是什么都不起作用。

本地宏是。。。。地方的这意味着仅在同一交互式会话、程序、do文件或do文件编辑器窗口中的(一块)代码中可见

Globals是一种使东西随处可见的粗糙解决方案,但您必须使用
$
来引用它们。所以在你的
跑步中,你需要

ctitle($mode)
将内容作为参数传递是一个更好的解决方案

另请参见
包含的帮助


所有这些都是非常基本的Stata编程。要想成为一名有能力的Stata程序员,只需提供一个最低限度的参考资料,该参考资料也会与您的系统上的Stata捆绑在一起(除非您的版本已经过时几年)

下面的代码片段展示了@Nick在您的示例上下文中的出色建议

1.更改
run.do
以调用全局宏而不是本地宏: 2.将
run.do
转换为程序,并将本地宏
模式
作为参数传递: 3.
包括
文件
run.do
main.do中按原样执行:

最后一种方法更接近您正在寻找的“继承”解决方案。

本地和全局宏在Stata中不被视为变量。当然,它们松散地对应于其他地方称为变量的实体,但Stata的使用是严格的和统计的:Stata中的变量是(并且只是)数据集中的一列。有关更多讨论,请参见例如。
foreach mode in mode1 mode2 {
global mode "`mode'"
do run.do
}
ctitle($mode)
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
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'
}
foreach mode in mode1 mode2 {
    include run.do
}