Question

Est-il possible, dans R, pour faire apparaître un message d'erreur si une fonction utilise une variable non déclarés dans le corps de la fonction: i.e., je veux quelqu'un pour signaler ce type de fonctions

aha<-function(p){
  return(p+n)
}

voir; s'il arrive à être une variable « n » se trouvant quelque part, aha (p = 2) va me donner une « réponse » puisque R va juste prendre « n » de cet endroit mystérieux appelé le « environnement »

Était-ce utile?

La solution

Si vous voulez détecter les problèmes potentiels pendant la phase d'écriture du code et non pendant l'exécution, le paquet codetools est votre ami.

library(codetools)
aha<-function(p){ 
  return(p+n) 
}

#check a specific function:
checkUsage(aha) 

#check all loaded functions:
checkUsageEnv(.GlobalEnv)

Ils vous diront que no visible binding for global variable ‘n’.

Autres conseils

La suggestion de Richie est très bon.

Je voudrais juste ajouter que vous devriez envisager de créer des cas de test unitaire qui courraient dans un environnement R propre. Cela permettra également d'éliminer les préoccupations sur les variables globales et assure que vos fonctions se comportent de la façon dont ils le devraient. Vous voudrez peut-être envisager d'utiliser RunIt pour cela. J'ai ma suite de test programmé pour exécuter tous les soirs dans un nouvel environnement en utilisant RSCRIPT, ce qui est très efficace et attraper toutes sortes de questions de portée, etc.

Ecrire des codes R pour vérifier autre code R va être difficile. Il faudrait trouver un moyen de déterminer quels bits de code sont des déclarations de variables, puis essayer de travailler si elles avaient déjà été déclarés dans la fonction. EDIT: La déclaration précédente aurait été vrai, mais comme Aniko a souligné, le travail a déjà été fait dans le paquet codetools .

Une chose connexe qui peut être utile pour vous est de forcer une variable à prendre de la fonction elle-même (plutôt que d'un environnement englobante).

Cette version modifiée de votre fonction échouera toujours, puisque n n'est pas déclarée.

aha <- function(p) 
{ 
   n <- get("n", inherits=FALSE)
   return(p+n)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top