*! version 2.47.0 17mar2021 program ms_expand_varlist, rclass syntax [varlist(ts fv numeric default=none)] [if] fvexpand `varlist' `if' loc varlist `r(varlist)'`' foreach part of local varlist { _ms_parse_parts `part' loc ok = r(omit) == 0 loc mask `mask' `ok' if (`ok') { // If we don't run this, st_data will load some columns as vectors of ZEROES (!) // EG: // set obs 5 // gen id = _n // mata: st_data(., "1.id 2.id") // The 1st column is empty! // mata: st_data(., "1bn.id 2.id 3.id") // correct result //di as error "AFTER=[`part']" AddBN `part' loc all_vars `all_vars' `part' loc selected_vars `selected_vars' `part' } else { loc all_vars `all_vars' `part' *di as error "OMITTED/BASE: `part'" } } return local fullvarlist `varlist' // i.rep78 -> 1b.rep78 2.rep78 3.rep78 return local fullvarlist_bn `all_vars' // i.rep78 -> 1b.rep78 2bn.rep78 3bn.rep78 return local varlist `selected_vars' // i.rep78 -> 2bn.rep78 3bn.rep78 return local not_omitted `mask' // i.rep78 -> 0 1 1 end capture program drop AddBN program define AddBN loc part `0' loc re "^([0-9]+)b?([.LFSD])" loc match = regexm("`part'", `"`re'"') if (`match') { loc part = regexr("`part'", "`re'", regexs(1) + "bn" + regexs(2)) } loc re "#([0-9]+)b?([.LFSD])" loc loop = strpos("`part'", "#") loc old `part' while (`loop') { loc match = regexm("`part'", `"`re'"') if (`match') { loc part = regexr("`part'", "`re'", "#" + regexs(1) + "bn" + regexs(2)) } loc loop = "`old'" != "`part'" loc old `part' } c_local part `part' end