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

Inheriting looping variable or local, global 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 无法获取 mode

这意味着 main.do 中的 mode 循环没有被 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
}

但没有任何效果。

局部宏是....局部的。意味着仅在相同的交互式会话、程序、do-file 或 do-file 编辑器 window 中的(大块)代码中可见。

全局变量是使内容随处可见的粗略解决方案,但您必须使用 $ 引用它们。所以在你的 run.do 中你需要

ctitle($mode)

将内容作为参数传递是一个更好的解决方案。

另请参阅 include 的帮助。

所有这些都是完全基础的 Stata 编程。要成为一名合格的 Stata 程序员,最低限度的参考资料是 https://www.stata.com/manuals/u18.pdf,它也与您系统上的 Stata 捆绑在一起(除非您的版本已经过时数年)。

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

1。更改 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

2。将 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'
}

3。 include main.do 中的文件 run.do 原样:

foreach mode in mode1 mode2 {
    include run.do
}

最后一种方法更接近您正在寻找的 'inheritance' 解决方案。