-1

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循环 inmain.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
}

但没有任何效果。

4

2 回答 2

1

本地宏是....本地的。表示仅在相同的交互式会话、程序、do-file 或 do-file 编辑器窗口中的(块)代码中可见。

全局变量是让东西随处可见的粗略解决方案,但您必须使用$. 所以在你的run.do你需要

ctitle($mode)

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

另请参阅 的帮助include

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

于 2018-02-23T07:27:09.900 回答
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
}

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

于 2018-07-03T19:41:06.830 回答