循环宏的宏

Looping over macro of macros

我定义了一个宏中的宏:

local my_macros "`macro1' `macro2' `macro3'"

每个单独的宏都有一个协变量列表,例如

local macro1 "cov1 cov2 cov3"
local macro2 "cov4 cov5 cov6"
local macro3 "cov7 cov8 cov9"

当我循环 my_macros 时,我想提取每个单独的宏。例如,如果我有

for each m in my_macros{
    di `m'
}

然后它会理想地打印三个宏,比如

`macro1'
`macro2'
`macro3'

cov1 cov2 cov3
cov4 cov5 cov6
cov7 cov8 cov9

这是因为我 运行ning 的实际循环是回归,每个宏都是我想要 运行 的协变量列表。但是,输出看起来像

for each m in my_macros{
    di `m'
}

0
0
0
0
0
0
0
0
0
0

所以在完整的回归循环中,一次只有一个协变量被包含在回归中。有谁知道发生了什么以及如何在我打印 `my_macros'?

时将每个宏作为一行输出

解决方法你想要的可以通过嵌套宏引用来实现

local macro1 "cov1 cov2 cov3"
local macro2 "cov4 cov5 cov6"
local macro3 "cov7 cov8 cov9"

没关系。但现在循环此类宏的关键步骤可能是

forval j = 1/3 {
    ... `macro`j'' ... 
} 

圆点表示还需要什么。宏的求值与初等代数或算术中使用圆括号、方括号或大括号的求值完全相同:首先对最内层的引用求值,因此首先对宏 j 的引用求值。

误解题目中包含各种大大小小的误解

M1。 for eachforeach 的重复拼写错误。

M2。 in my_macros 写在只有 of local my_macros 有意义的地方。

M3。一旦您从三个宏中定义了一个宏,每个宏都包含三个词,原始宏就不再具有作为三个独立实体的任何身份。关卡是新的宏;它的组成词(这里是变量名);和单个字符(此处不相关)。要保留此类身份,您需要引入标点符号,例如逗号,并使用该标点符号解析内容。但是这里使用嵌套引用更容易,根本不用定义更宽的宏。

M4。假设你真的分两步定义了 my_macros 使得它最终包含了九个变量名,那么一个像

这样的循环
  foreach m of local my_macros { 
      di `m' 
  } 

将依次发出九个命令,例如

     di cov1 

每个这样的命令都会在第一次观察中显示每个变量的值(Stata 这样做并不明显,但确实如此)。也就是说,

    di `m' 

(其中局部宏m包含一个变量名)完全等同于

    di `m'[1] 

要查看名称,即宏内的文本,这里是变量名,而不是值,您需要循环内的语句是

   di "`m'" 

因此双引号 " " 坚持名称,而不是值,被 displayed。尽管您没有提供数据示例或可重现的代码,但当且仅当所有这九个变量在第一次观察中都包含零时,才会显示一系列九个(不是十个)零。

名称和值之间的相同混淆发生在您之前的线程中