2016-09-04 2 views
2

Определить макрос try:Сформировать новый макрос префиксов слова старого макроса

local try "a b c"

Это создаст макрос со значением

a b c

Теперь я хочу новый макрос try2, который принимает значение

da db dc

Другими словами, я хочу добавить тот же префикс к каждому элементу старого макроса и определить его как новый макрос.

ответ

2

Существует, насколько я знаю, никакой функции, которая специально поддерживает это в официальной Stata. Для близлежащих функций см. help macrolists.

Старая упаковка listutil (SSC) включает в себя различные команды, соответствующие prelist. Я написал это, поэтому он не отрицательно относится к работе других, что заставляет меня рекомендовать просто применять общую технику.

local try "a b c" 
local copy `try' 
gettoken first copy : copy 

while ("`first'" != "") { 
    local try2 `try2' d`first' 
    gettoken first copy : copy 
} 

di "try is {col 12} `try'" 
di "try2 is{col 12} `try2'" 
+0

Большое вам спасибо, это хорошо решает мою проблему. :) – sxgn

+2

@sxgn Если это поможет, вы можете выбрать это как ответ, используя галочку слева. –

1

Вы можете сделать это, используя Mata.

local try "a b c" 
mata: st_local("try2", invtokens("d" :+ tokens(st_local("try")))) 

assert "`try2'" == "da db dc" 

В словах, это то, что делает вторая линия, объясняя самую внутреннюю функцию первого:

  1. st_local("try"): доступ к содержимому в локальной переменной. Это должно оцениваться как «a b c».
  2. tokens("a b c"): Разделите строку на токены, например. tokens("a b c") ->("a", "b", "c").
  3. "d" :+ ("a", "b", "c"): В Мате, вы можете конкатенации строк с +, а вот :+ делает этот поэлементно, так что результат будет («да», «БД», постоянным ток ")
  4. invtokens(("da", "db", dc")):. Поместите жетоны обратно в строку, т.е. invtokens(("da", "db", dc")) ->"da db dc"
  5. st_local("try2", "da db dc"):. Мат эквивалент local try2 "da db dc"

Вы можете узнать больше о Мате функции st_local(), tokens() и invtokens() с, например. , help mf_st_local.

Смежные вопросы