Наследование циклической переменной или локальных глобальных макросов
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 ответа
Локальные макросы.... локальные. значение, видимое только в одном и том же интерактивном сеансе, программе, do-file или (фрагменте) кода в окне редактора do-file.
Глобалы - это грубое решение, позволяющее сделать вещи видимыми повсюду, но вы должны ссылаться на них как на $
, Так в вашем 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
файл run.do
в main.do
как есть:
foreach mode in mode1 mode2 {
include run.do
}
Последний подход ближе к решению "наследования", которое вы ищете.