Error handling 当未定义全局宏而不是缺少字符串时,是否可以使Stata在默认情况下引发错误?

Error handling 当未定义全局宏而不是缺少字符串时,是否可以使Stata在默认情况下引发错误?,error-handling,stata,stata-macros,Error Handling,Stata,Stata Macros,Stata的一个有时不方便的功能是调用未定义的宏返回缺少的值[编辑:Stata实际上返回缺少的字符串”,而不是数字缺少值],而不是抛出错误。 如果宏名称拼写错误,则需要定义宏才能正确执行的代码可能会运行,并给出错误的结果 例如:定义了 global$options=,vce(稳健),当 之后,编写reg y x$opt而不是reg y x$options程序仍在运行,可能很难意识到未考虑vce()选项 在这种情况下,有没有办法强迫Stata发布错误,或者有没有一些有用的技巧/最佳做法可以用来降低

Stata的一个有时不方便的功能是调用未定义的宏返回缺少的值
[编辑:Stata实际上返回缺少的字符串
,而不是数字缺少值],而不是抛出错误。 如果宏名称拼写错误,则需要定义宏才能正确执行的代码可能会运行,并给出错误的结果

例如:定义了
global$options=,vce(稳健)
,当 之后,编写
reg y x$opt
而不是
reg y x$options
程序仍在运行,可能很难意识到未考虑
vce()
选项


在这种情况下,有没有办法强迫Stata发布错误,或者有没有一些有用的技巧/最佳做法可以用来降低发生此类错误的风险?

该功能描述不正确。未定义的宏将作为空字符串计算,按惯例写入
,即分隔符
不包含任何内容,或者如果愿意,分隔符之间不包含任何内容

未定义的宏永远不会被计算为数字系统缺失,以句点
形式写入(如果需要,可以称之为点或停止)

如果宏被设置为包含系统丢失的其他内容,您将看到系统丢失,这是完全不同的。例如,从程序保存的结果可能缺少系统

理解这一点的一种方法是Stata中的宏包含字符串,而不是数值;有些宏具有数字解释的事实是另一回事。因此,未定义的宏将作为空字符串计算

Stata程序员学习如何建设性地使用此功能,以便在未定义宏时允许默认值,在定义宏时允许其他选择

你是对的,该功能是bug的来源,比如拼写错误导致Stata看到一个未定义的名称,而忽略了引用。这个bug仍然是程序员的bug,而不是斯塔塔的bug

那么,除了像往常一样检查代码之外,您还能做什么呢?始终可以检查是否定义了宏,如中所示

if "$options" == "" { 
    * do something 
} 
else {
    * do something else 
} 
相反地

if "$options" != "" 
是对内容的测试

或者,可以使用字符串标量。下面是一个实验:

. sysuse auto, clear
(1978 Automobile Data)

. scalar foo = ", meanonly"

. summarize mpg `=scalar(foo)'

. ret li

scalars:
                  r(N) =  74
              r(sum_w) =  74
                r(sum) =  1576
               r(mean) =  21.2972972972973
                r(min) =  12
                r(max) =  41

. summarize mpg `=scalar(bar)'
bar not found

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
         mpg |         74     21.2973    5.785503         12         41
在本例中,当引用未定义的标量时,会出现一条错误消息,但该命令以任何方式执行

就我个人而言,作为一名长期(1991-)和高强度的Stata用户,我只是经常使用宏,并将偶尔被此类错误咬视为为此付出的非常小的代价。在试图回答这个问题之前,我从未使用过这种意义上的字符串标量


这是一个不同的论点,但我认为以这种方式使用全局宏是糟糕的编程风格。在编程过程中,对于最小化全局声明实体的使用,存在着普遍的争论。本地宏是首选

有趣的问题!