Voici mon code R. Les fonctions sont définies comme:
f <- function(x, T) {
10 * sin(0.3 * x) * sin(1.3 * x ^ 2) + 0.001 * x ^ 3 + 0.2 * x + 80
}
g <- function(x, T, f=f) {
exp(-f(x) / T)
}
test <- function(g=g, T=1) {
g(1, T)
}
L'erreur de fonctionnement est:
> test ()
Erreur dans test ():
promesse déjà en cours d'évaluation: référence d'argument récursif par défaut ou problèmes antérieurs?
Si je remplace la définition de f
par celle de g
, l'erreur disparaît.
Je me demandais quelle était l'erreur? Comment le corriger si on ne substitue pas la définition de f
à celle de g
? Merci!
Mettre à jour:
Merci! Deux questions:
(1) si la fonction test
prend en outre un argument pour f
, allez-vous ajouter quelque chose comme test <- function(g.=g, T=1, f..=f){ g.(1,T, f.=f..) }
? Dans les cas où il y a plus de récursions, est-ce une bonne et sûre pratique d'ajouter plus . ?
(2) si f
un argument non fonctionnel, par exemple g <- function(x, T, f=f){ exp(-f*x/T) }
et test <- function(g.=g, T=1, f=f){ g.(1,T, f=f.) }
, est-ce que l'utilisation du même nom pour les arguments non fonctionnels formels et réels est-elle une bonne et sûre pratique ou cela peut causer des problèmes potentiels?
.....cumbersome
. :)...
ou une liste pour transmettre les arguments dans la chaîne de fonctions. C'est beaucoup plus flexible (pour le meilleur et pour le pire) que de tout prédéfinir. Vous pourriez finir par avoir besoin d'ajouter quelques vérifications pour vous assurer que vos arguments d'origine dans les ellipses (ou la liste) sont raisonnables.get("f", envir = parent.frame())
.Si vous spécifiez le contexte d'évaluation des arguments, vous évitez le problème du même nom:
la source
J'aime la réponse de G. Grothendieck , mais je me demandais que c'est plus simple dans votre cas de ne pas inclure les noms de fonctions dans les paramètres des fonctions, comme ceci:
la source
Comme déjà mentionné, le problème vient d'avoir un argument de fonction défini comme lui-même. Cependant, je veux ajouter une explication de la raison pour laquelle c'est un problème parce que la compréhension qui m'a conduit à un moyen plus simple (pour moi) d'éviter le problème: il suffit de spécifier l'argument dans l'appel au lieu de la définition.
Cela ne fonctionne pas:
mais cela fonctionne:
Les arguments de fonction existent dans leur propre environnement local.
R recherche d'abord les variables dans l'environnement local, puis dans l'environnement global. C'est comme dans une fonction qu'une variable peut avoir le même nom qu'une variable dans l'environnement global, et R utilisera la définition locale.
Le fait que les définitions d'arguments de fonction forment leur propre environnement local est la raison pour laquelle vous pouvez avoir des valeurs d'argument par défaut basées sur d'autres valeurs d'argument, comme
C'est pourquoi vous ne pouvez pas DEFINIR une fonction comme
my.function <- function(x = x){}
mais vous pouvez APPELER la fonction en utilisantmy.function(x = x)
. Lorsque vous définissez la fonction, R devient confus car il trouve l'argumentx =
comme valeur locale dex
, mais lorsque vous appelez la fonction, R trouvex = 4
dans l'environnement local à partir duquel vous appelez .Ainsi, en plus de corriger l'erreur en modifiant le nom de l'argument ou en spécifiant explicitement l'environnement comme mentionné dans d'autres réponses, vous pouvez également simplement le spécifier
x=x
lorsque vous appelez la fonction plutôt que lorsque vous la définissez. Pour moi, spécifier celax=x
dans l'appel était la meilleure solution, car cela n'implique pas de syntaxe supplémentaire ni d'accumulation de plus en plus de noms de variables.la source