📄 _parmlist.ado
字号:
*! version 1.2.0 14oct2004
program define _parmlist , rclass
version 8
/* parses an expression that contains parameters, where parameters can
be {parmname} or {parmname=initializer}. Spaces before or after
parmname, "=", or intializer are tolerated and removed from the
returned expression.
Returns:
r(expr) the expression with initializers removed and all
parameters cleaned up to be {parmname}.
r(parmlist) a list of the parameters with each parameter
listed only once.
r(initmat) a matrix of initializers that may NOT be aligned
with parmlist (access be name) parmlist and
which contains 0 for parameter that have not
been assigned initializers.
r(k) number of parameters
example:
_parmlist {a=5} * mpg / price { b=4}*{ a = 7 }*{ c }
returns:
r(k) = 3
r(expr) : "{a} * mpg / price {b} * {a} * {c}"
r(parmlist) : "a b c"
r(inttmat) = 7 , 4 , 0
*/
/* get rid of possible spaces
in { parmname } */
local ct 1
while `ct' > 0 {
local 0 : subinstr local 0 "{ " "{", all count(local ct)
}
local ct 1
while `ct' > 0 {
local 0 : subinstr local 0 " }" "}", all count(local ct)
}
/* Pick off parameters -- {parmname} */
local parmlist
tempname initmat mat1 ival
gettoken pre rest : 0 , parse("{")
while "`rest'" != "" {
local pre : subinstr local pre "{" ""
local expr `expr' `pre'
/* find end of {parmname [=init]} */
gettoken parminit rest : rest , parse("}")
if substr("`rest'",1,1) != "}" {
di as error "invalid expression equation"
di as error "`0'"
exit 198
}
local parminit : subinstr local parminit "{" ""
local rest : subinstr local rest "}" ""
/* Is parminit a linear combination? */
local parminit : subinstr local parminit " :" ":", all
local parminit : subinstr local parminit ": " ":", all
gettoken eqname vars : parminit , parse(":")
if "`vars'" != "" {
local vars : subinstr local vars ":" "", all
tsunab vars : `vars'
foreach var in `vars' {
confirm numeric variable `var'
local varpar = substr("`eqname'_`var'", 1, 25)
local unused : subinstr local parmlist /*
*/ "`varpar'" "`varpar'", /*
*/ count(local j)
if `j' > 0 {
local i = 0
while `j' > 0 & `i' < 99999 {
local nicei : di %05.0f `i'
local unused : subinstr /*
*/ local parmlist /*
*/ "`varpar'`nicei'" /*
*/ "`varpar'`nicei'", /*
*/ count(local j)
local i = `i' + 1
}
if `j' != 0 {
exit 103
}
local varpar "`varpar'`nicei'"
}
matrix `mat1' = 0
UpdateInitVals `initmat' "`varpar'" `mat1'
local parmlist `parmlist' `varpar'
local expr "`expr' {`varpar'} *`var'"
if "`ferest()'" != "" {
local expr "`expr' +"
}
}
}
else { /* Just a single parameter */
/* evaluate or create initial
value */
gettoken parm init : parminit, parse("=")
local parm `parm' /* sic, trimblanks */
if "`init'" != "" {
scalar `ival' `init'
}
else scalar `ival' = .
/* mainitain initial values
matrix */
matrix `mat1' = `ival'
UpdateInitVals `initmat' "`parm'" `mat1'
/* maintain parmlist */
local unused : subinstr local parmlist /*
*/ "`parm'" "`parm'" , count(local ct)
if `ct'==0 {
local parmlist `parmlist' `parm'
}
/* put {parmname} into expr */
local expr "`expr' {`parm'}"
}
gettoken pre rest : rest , parse("{")
}
local expr `expr' `pre'
/* Return results */
return matrix initmat `initmat'
return scalar k = `:word count `parmlist''
return local parmlist `parmlist'
return local expr `expr'
end
program UpdateInitVals
version 8
args initmat parm ivalmat
local col "."
capture local col = colnumb(`initmat', "`parm'")
if _rc | `col' == . {
if `:word count `parm'' > 1 {
di as error "`parm' is an invalid name"
exit 7
}
confirm names `parm'
/* If no initial value, set to zero */
if `ivalmat'[1,1] >= . {
mat `ivalmat'[1,1] = 0
}
mat colnames `ivalmat' = `parm'
mat `initmat' = nullmat(`initmat') , `ivalmat'
}
else if `ivalmat'[1,1] < . {
mat `initmat'[1, `col'] = `ivalmat'[1,1]
}
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -