【问题标题】:Stata: Check if a local macro is undefinedStata:检查本地宏是否未定义
【发布时间】:2011-07-10 03:19:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: undefined stata stata-macros


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为没有“官方”的方式来做这种事情。您可以阅读 Stata 附带的 .ado 文件(在 C:\Program Files\... 中),它们为这种测试做了不同的事情。您可能也对cond() 函数感兴趣。
    • 我没有在原始问题中指定这一点,但我实际上是在尝试检查宏名称是否未定义。事实证明,if !missing(`macroname') { 适用于此。非常感谢!
    • 这完全等同于我后来的回答,只是间接了一步。对于字符串,空算作缺失,因此缺失测试与空测试完全相同。
    【解决方案2】:

    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'" != "" 
    

    【讨论】:

    • 感谢您的编辑。它更微妙。例如,所有本地人都是真正的字符串,或者包含字符串。因此,字符串"." 强调并不意味着缺失,也不等于缺失,因为字符串表达式当且仅当它们是空字符串时才被认为是缺失的。但是一旦离开宏并且在上下文中是空的句点可能意味着数字缺失。你知道,但这是初学者程序员需要掌握的其他内容。
    【解决方案3】:

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

     if "`macroname'" != "" 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2013-05-19
      • 2018-09-09
      • 1970-01-01
      相关资源
      最近更新 更多