继承循环变量或局部、全局宏
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' 解决方案。
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' 解决方案。