Oh, la merveilleuse odeur de variables globales...
Toutes les réponses dans ce post a R des exemples, et l'OP voulait Stata exemples, ainsi. Permettez-moi donc de carillon avec ces.
Contrairement R, Stata ne prendre soin de la localité de sa macros locales (celles que vous créez avec local
de la commande), de sorte que la question de "Est-ce de ce mondial z ou z qui est de retour?" ne jamais se lève. (Mon dieu... comment pouvez-vous R gars écrire du code si la localité n'est pas appliquée???) Stata est un autre bizarrerie, cependant, à savoir qu'un inexistante local ou global macro est évalué comme une chaîne vide, ce qui peut ou peut ne pas être souhaitable.
J'ai vu des variables globales utilisées pour plusieurs raisons principales:
-
Globales sont souvent utilisées comme raccourcis pour la liste des variables, comme dans
sysuse auto, clear
regress price $myvars
Je soupçonne que l'utilisation principale de cette construction est pour quelqu'un qui alterne entre la frappe interactives et de stocker le code dans un fichier comme ils essaient plusieurs spécifications. Dire qu'ils essaient de régression avec homoskedastic erreurs standard, heteroskedastic standard des erreurs, et la médiane de régression:
regress price mpg foreign
regress price mpg foreign, robust
qreg price mpg foreign
Et puis ils s'ces régressions avec un autre ensemble de variables, puis à un autre encore, et finalement abandonner et de le configurer comme un faire-fichier myreg.do
avec
regress price $myvars
regress price $myvars, robust
qreg price $myvars
exit
pour être accompagné avec un réglage approprié de la global macro. C'est très bien; l'extrait de code
global myvars mpg foreign
do myreg
produit les résultats désirés. Maintenant, disons qu'ils ont envoyer leur fameux faire-fichier qui prétend produire de très bons résultats de la régression pour les collaborateurs et leur demander de type
do myreg
Quelles seront leurs collaborateurs de voir? Dans le meilleur des cas, la moyenne et la médiane d' mpg
si ils ont démarré une nouvelle instance de Stata (échec du couplage: myreg.do
n'a pas vraiment de savoir que vous vouliez exécuter ce avec un non-vide de la liste des variables). Mais si les collaborateurs ont quelque chose dans les travaux, et avaient aussi un mondial myvars
défini (collision de nom)... l'homme, ce serait un désastre.
-
Globales sont utilisées pour de fichier ou de répertoire des noms, comme dans:
use $mydir\data1, clear
Dieu seul sait ce qui va être chargé. Dans les grands projets, cependant, ne viennent à portée de main. Vous souhaitez définir global mydir
quelque part dans ton maître n'-fichier, peut-être même que
global mydir `c(pwd)'
-
Globals peut être utilisé pour stocker une imprévisible de la merde, comme un ensemble de commande:
capture $RunThis
Dieu seul sait ce que sera exécuté. C'est le pire cas de l'implicite de couplage fort, mais depuis que je ne suis même pas sûr qu' RunThis
contiendra rien de constructif, j'ai mis un capture
, en face de lui, et sera prêt à traiter les non-zéro code de retour _rc
. (Voir, cependant, mon exemple ci-dessous).
-
Stata est propre utilisation de variables globales est pour Dieu paramètres, comme le type I de la probabilité d'erreur/niveau de confiance: le global $S_level
est toujours défini (et vous devez être un total idiot de redéfinir ce mondial, même si bien sûr il est techniquement faisable). C'est, cependant, la plupart du temps héritage problème avec le code de la version 5 et au-dessous (à peu près), que la même information peut être obtenue à partir de moins fragiles du système de la constante:
set level 90
display $S_level
display c(level)
Heureusement, globales sont tout à fait explicite dans Stata, et sont donc facile à déboguer et à enlever. Dans certains des cas ci-dessus, et certainement dans la première, vous voulez passer des paramètres à faire des fichiers qui sont considérés comme les locaux `0'
à l'intérieur du faire-fichier. Au lieu d'utiliser des variables globales dans l' myreg.do
le fichier, je serais probablement de code comme
unab varlist : `0'
regress price `varlist'
regress price `varlist', robust
qreg price `varlist'
exit
L' unab
chose va servir d'élément de protection: si l'entrée n'est pas un varlist, le programme s'arrête avec un message d'erreur.
Dans le pire des cas, j'ai vu, le mondial a été utilisé qu'une seule fois après avoir été définies.
Il ya des occasions où vous voulez utiliser des variables globales, parce que sinon vous auriez à passer le truc à chaque autre, d'un fichier ou d'un programme. Un exemple où j'ai trouvé la globals pratiquement inévitable a été le codage d'un estimateur du maximum de vraisemblance où je ne savais pas à l'avance combien d'équations et de paramètres je l'aurais fait. Stata insiste sur le fait que l' (fourni par l'utilisateur) la probabilité de l'évaluateur aura équations spécifiques. J'ai donc dû s'accumuler mes équations dans le globals, et ensuite appeler mon évaluateur avec les variables globales dans la description de la syntaxe que Stata aurait besoin d'analyser:
args lf $parameters
où lf
a la fonction objectif (la log-vraisemblance). J'ai rencontré au moins deux fois, dans le mélange habituel de package (denormix
) et de l'analyse factorielle confirmatoire paquet (confa
); vous pouvez l' findit
tous les deux, bien sûr.