9

我正在编写一个 Statado文件,如果用户不提供某些参数,我想提供默认值。为此,我想检查一个宏是否未定义。

我想出了一个hacky方法来做到这一点:

*** For a local macro with the name value:
if `value'1 != 1 {
    ...do stuff
}

但我想知道是否有一种惯用的方法来做到这一点。

4

3 回答 3

9

如果未定义,则宏的内容将为空。你可以这样做:

if missing(`"`mymacroname'"') {
    display "Macro is undefined"
}

如果宏将包含数字,则实际上不需要引号。该missing(x)函数可以处理字符串和数字。这有点像测试(x=="" | x==.)放置允许宏包含引号,`'如."`mymacroname'"local mymacroname `"foo"' `"bar"'

于 2011-03-07T18:47:51.003 回答
7

这个问题要求一种惯用的方式来做到这一点,并且跨越 Stata 程序员

 if "`macroname'" != "" 

是迄今为止最常用的测试是否定义了宏。宏在定义时包含字符串,这是一般用法;使用数字字符只是一种特殊情况。

于 2013-07-06T10:38:27.197 回答
3

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'" != "" 
于 2020-09-17T17:15:16.197 回答