继承循环变量或本地全局宏

时间:2018-02-23 02:48:54

标签: 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无法获得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
}

但没有任何作用。

2 个答案:

答案 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的出色建议。

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中的文件run.do main.do照原样

foreach mode in mode1 mode2 {
    include run.do
}

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