J'écris une fonction R en utilisant if & else if dedans. Voir le code ci-dessous :

i_ti_12 <- function(x){
  if (x <= 44)
  {ti = exp(-13.2238 + 0.152568*x)}
  else if (x >= 49)
  {ti = -0.01245109 + 0.000315605*x}
  else (x > 44 & x < 49)
  {ti = (x-44)*(i_ti_12(49))/(49-44) + (49-x)*(i_ti_12(44))/(49-44)}
  return(ti)
}

Je souhaite utiliser la sortie de cette fonction, i_ti_12(49) dans cette fonction, mais le code ci-dessus ne fonctionne pas. La sortie est :

> i_ti_12(49)
Error: C stack usage  7974292 is too close to the limit

La solution simple consiste simplement à remplacer i_ti_12(49) par -0.01245109 + 0.000315605*49, mais ce n'est pas un moyen clair de le résoudre et pourrait ne pas fonctionner dans des cas complexes.

Donc je veux vraiment savoir et apprendre s'il existe des méthodes claires pour le faire ? Je veux dire, comme l'exemple simple ci-dessus, écrire une fonction conditionnelle en utilisant la sortie d'une condition dans cette fonction. Toute aide est très appréciée.

0
Hillary 19 févr. 2020 à 14:09

1 réponse

Meilleure réponse

Votre dernier else est suivi d'une condition (x > 44 & x < 49), qui n'est en fait pas correcte. Si vous avez (x > 44 & x < 49) là, cela signifie que vous exécuterez cette instruction, et ti = (x-44)*(i_ti_12(49))/(49-44) + (49-x)*(i_ti_12(44))/(49-44) est quelque chose d'indépendant avec votre structure if-else.

Dans ce cas, lorsque vous appelez i_ti_12(49), votre fonction ne sait pas quand la récursivité doit être terminée puisque vous n'avez pas défini ce cas.

Vous pouvez essayer le code ci-dessous:

i_ti_12 <- function(x){
  if (x <= 44)
  {ti = exp(-13.2238 + 0.152568*x)}
  else if (x >= 49)
  {ti = -0.01245109 + 0.000315605*x}
  else
  {ti = (x-44)*(i_ti_12(49))/(49-44) + (49-x)*(i_ti_12(44))/(49-44)}
  return(ti)
}

Tel que

> i_ti_12(49)
[1] 0.003013555
2
ThomasIsCoding 19 févr. 2020 à 11:25