8
votes

Stata: Vérifiez si une macro locale est indéfinie

J'écris un fichier Stata do et je souhaite fournir des valeurs par défaut si l'utilisateur ne fournit pas certains paramètres. Pour ce faire, je voudrais vérifier si une macro est indéfinie.

Je suis arrivé avec un moyen hacrain de faire cela: xxx

mais j'aimerais savoir s'il y a une manière idiomatique de le faire.


0 commentaires

3 Réponses :


8
votes

S'il est indéfini, le contenu de la macro serait vide. Vous pouvez faire ceci:

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


3 commentaires

Je ne pense pas qu'il y ait une façon "officielle" de faire ce genre de chose. Vous pouvez lire les fichiers .ado fournis avec STATA (dans C: \ Program Files \ ... ) Ils font des choses différentes pour ce type de test. Vous pourriez être intéressé par la fonction Cond () , aussi.


Je n'ai pas spécifié cela dans ma question initiale, mais j'essaie de vérifier si un nom de macro est pas non défini. Il s'avère que si! Manquant (`macroname ') { fonctionne pour cela. Merci beaucoup!


Ceci est totalement équivalent à ma réponse ultérieure, juste un pas plus indirect. Pour les chaînes, les comptes vides manquants, un test de manquant est donc précisément le même test qu'un test d'être vide.



6
votes

La question posée pour une manière idiomatique de faire cela et entre les programmeurs STATA xxx

est éloigné par le test le plus couramment utilisé de savoir si une macro est définie. Les macros contiennent des chaînes lorsqu'elles sont définies, ce qui est l'utilisation générale; L'utilisation de caractères numériques n'est qu'un cas particulier.


0 commentaires

3
votes

OP a demandé s'il y avait un moyen de tester si un local est indéfini. Le concept de défini / indéfini n'existe pas vraiment dans Stata (qui est déroutant pour les utilisateurs Nouveau à Stata mais pas nouveau à la programmation).

A plus de Stata comme une manière de penser à cela est si le local manque ou non . Si un local n'a pas été défini, il est considéré comme manquant. Mais si un local a été défini à une valeur manquante, comme la chaîne vide "" code>, il est également considéré comme manquant. P>

Donc, il n'y a aucun moyen à la différence de la distinction entre Une chaîne locale d'être indéfinie ou définie mais contient une valeur manquante, c'est-à-dire la chaîne vide "" code>. Les deux réponses déjà données ne capturent pas la différence entre locala code> (défini mais comme chaîne vide) et localb code> (non défini) dans l'exemple ci-dessous: P>

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


1 commentaires

Merci pour la modification. C'est plus subtil encore. Par exemple, tous les sections locales sont vraiment des cordes ou contiennent des chaînes. Donc, la chaîne "." ne veut pas dire manquante, ni égale à manquer, car les expressions de chaîne sont considérées comme manquantes si et seulement s'ils sont des cordes vides .. mais néanmoins une fois sorties d'un macro et en contexte une période nue peut signifier numérique manquant. Vous savez que, mais c'est quelque chose que les programmeurs de débutants doivent saisir.