循环宏的宏
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 each
是 foreach
的重复拼写错误。
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'"
因此双引号 " "
坚持名称,而不是值,被 display
ed。尽管您没有提供数据示例或可重现的代码,但当且仅当所有这九个变量在第一次观察中都包含零时,才会显示一系列九个(不是十个)零。
名称和值之间的相同混淆发生在您之前的线程中
我定义了一个宏中的宏:
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 each
是 foreach
的重复拼写错误。
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'"
因此双引号 " "
坚持名称,而不是值,被 display
ed。尽管您没有提供数据示例或可重现的代码,但当且仅当所有这九个变量在第一次观察中都包含零时,才会显示一系列九个(不是十个)零。
名称和值之间的相同混淆发生在您之前的线程中