(Извините, это «ответ», а не комментарий ... люди не оценивают мои ответы, поэтому у меня недостаточно баллов, чтобы комментировать вопрос.)
Во-первых,позвольте мне указать, что в Stata странно то, что она переводит макрос перед выполнением этой строки кода.Например:
Скажите, что вы печатаете.
local x3 = 20
local y = 3
display "I am `x`y'' years old"
Внутренне Stata собирается преобразовать локальные данные (от внутренней к внешней), а затем выполнить команду display
.То есть Stata переведет команду
display "I am `x3' years old"
, затем
display "I am 20 years old"
, а затем , Stata фактически выполнит эту последнюю строку кода.Вы можете посмотреть все это, выполнив сначала эту команду: set trace on
.
Есть небольшая разница.Скобки ` '
изменяют команду .Я думаю, что это на самом деле отличается от других языков программирования.В Stata часто можно что-то сделать с одной строкой кода, тогда как для других языков потребуются две строки кода (одна для «расширения» макроса; другая для выполнения строки кода).
Что полезно в этом, так это то, что Stata также может вычислять все виды выражений в скобках ` '
(при условии, что они возвращают число или строку ... например, ничего, что не возвращает матрицу)
display "I am `= 2011 - 1991' years old"
display "I am `= floor(uniform()*`x`y'')' years old"
Это очень полезно, когда вы привыкнете к нему.Макросы в Stata way делают вещи более чистыми, чем, например, в SAS.%let
заявления SAS не так гибки.
Я также собирался указать на несколько ошибок.
(1) В этих примерах петля настроена неправильно.x1, x2, ... , x100
- макросы (локальные), а не переменные.Вы не можете сказать foreach x of varlist x1 - x100
, потому что x1-x100
не является списком переменных.Если бы я пытался это сделать, я бы, вероятно, использовал:
local N = 100
forvalues i = 1/`N' {
local x`i' = `i' * `i'
}
Та же ошибка сделана во втором примере.r1
и r2
не являются переменными.Вы можете сделать это:
local mycommands regress corr
foreach r in `mycommands' {
`r' y x
}
(хотя я на самом деле набрал бы эквивалент, foreach r of local mycommands { ... }
, который, предположительно, выполняется быстрее).
(2) Во-вторых, ++i
недопустимо.Вы, вероятно, хотели сказать local ++i
.