promesse déjà en cours d’évaluation: référence d’argument par défaut récursive ou problèmes antérieurs?

Voici mon code R. Les fonctions sont définies comme suit:

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 courante est:

> test ()
Erreur dans test ():
promesse déjà en cours d’évaluation: référence d’argument par défaut récursive ou problèmes antérieurs?

Si je substitue la définition de f à celle de g , alors 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 test fonction prend un argument pour f , appendez-vous 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écurrences, est-ce une bonne pratique en toute sécurité ? ?

(2) si f est 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.) } , Utiliser le même nom pour les arguments non-fonctionnels formels et réels est-il une bonne pratique ou peut-il causer des problèmes potentiels?

Les arguments formels de la forme x=x provoquent ceci. En éliminant les deux cas où ils se produisent, nous obtenons:

 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) { ## 1. note f. exp(-f.(x)/T) } test<- function(g. = g, T = 1) { ## 2. note gg(1,T) } test() ## [1] 8.560335e-37 

Le même problème, le nom de la valeur par défaut, dans une fonction plus simple:

 f1=function(df1,tr=tr){ print(tail(tr)) } df1=data.frame() f1(df1) Error in tail(tr) : promise already under evaluation: recursive default argument reference or earlier problems? 

Une solution est simplement d’affecter tr explicitement:

  f1(df1,tr) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956 

Une autre solution est simplement de changer le nom du paramètre:

 f2=function(df1,tr1=tr){ print(tail(tr1)) } f2(df1) nu_pregao cd_papel true_range pc_true_range mdTr13 sdTr13 mdTr21 sdTr21 70315 1781 AGRO3 0.25 0.019 0.01492308 0.005880215 0.01628571 0.006709269 70316 1781 AELP3 0.47 0.157 0.04223077 0.041219239 0.06061905 0.055112137 70317 1781 ADHM3 0.05 0.026 0.03469231 0.014912996 0.02976190 0.014542712 70318 1781 ABEV3 0.52 0.022 0.02176923 0.006610016 0.02204762 0.008639885 70319 1781 ABCB4 0.69 0.037 0.02838462 0.010444604 0.02585714 0.009456668 70320 1781 AALR3 0.71 0.042 0.02700000 0.010885771 0.02466667 0.010184956 

Pourquoi R n’autorise-t-il pas le même nom pour la valeur par défaut?