我正在编写一个 Statado
文件,如果用户不提供某些参数,我想提供默认值。为此,我想检查一个宏是否未定义。
我想出了一个hacky方法来做到这一点:
*** For a local macro with the name value:
if `value'1 != 1 {
...do stuff
}
但我想知道是否有一种惯用的方法来做到这一点。
我正在编写一个 Statado
文件,如果用户不提供某些参数,我想提供默认值。为此,我想检查一个宏是否未定义。
我想出了一个hacky方法来做到这一点:
*** For a local macro with the name value:
if `value'1 != 1 {
...do stuff
}
但我想知道是否有一种惯用的方法来做到这一点。
如果未定义,则宏的内容将为空。你可以这样做:
if missing(`"`mymacroname'"') {
display "Macro is undefined"
}
如果宏将包含数字,则实际上不需要引号。该missing(x)
函数可以处理字符串和数字。这有点像测试(x=="" | x==.)
放置允许宏包含引号,`'
如."`mymacroname'"
local mymacroname `"foo"' `"bar"'
这个问题要求一种惯用的方式来做到这一点,并且跨越 Stata 程序员
if "`macroname'" != ""
是迄今为止最常用的测试是否定义了宏。宏在定义时包含字符串,这是一般用法;使用数字字符只是一种特殊情况。
OP询问是否有办法测试本地是否未定义。在 Stata 中实际上并不存在已定义/未定义的概念(这会让刚接触 Stata 而不是编程新手的用户感到困惑)。
一种更像 Stata 的思考方式是本地是否丢失或未丢失。如果未定义本地,则将其视为缺失。但是如果一个局部变量被定义为一个缺失值,比如空字符串""
,它也被认为是缺失的。
因此,Stata 无法区分本地字符串未定义或已定义但包含缺失值,即空字符串""
。已经给出的两个答案都没有捕获以下示例中(已localA
定义但为空字符串)和localB
(未定义)之间的区别:
*initiating localA to the empty string
local localA ""
*Both these conditions will evaluated identically
if missing("`localA'")
if missing("`localB'")
*Both these conditions will evaluated identically
if "`localA'" != ""
if "`localB'" != ""