Наследование циклической переменной или локальных глобальных макросов

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
}

Последний подход ближе к решению "наследования", которое вы ищете.

Другие вопросы по тегам