web-dev-qa-db-fra.com

Explication de R: options (expressions =) pour les non-informaticiens

J'ai écrit une fonction récursive du formulaire

foo=function(vars,i=2){
  **do something with vars**
  if(i==length(vars)){
    return(**something**)
  }else{
    foo(vars,i+1)
  }
}

length(vars) est d'environ 1500. Lorsque je l'exécute, j'ai eu l'erreur

Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
Error during wrapup: evaluation nested too deeply: infinite recursion / options(expressions=)?

Assez juste, alors j'ai augmenté

options(expressions=10000)

Alors ça marche.

Mais quand j'ai lu le document d'aide de options concernant expressions=, Je ne comprends tout simplement pas ce qu'il dit. En outre, il suggère

... Si vous l'augmentez, vous pouvez également vouloir démarrer R avec une pile de protection plus grande; ...

Alors, quelqu'un peut-il me dire ce qui se passe, si j'aurais dû augmenter les paramètres expressions comme je l'ai fait, et si je devais modifier quelque chose d'autre avec lui.

27
qoheleth

Couper quelques coins ici ... L'option-expressions définit le nombre maximum d'expressions imbriquées qui seront évaluées. Avec une récursivité profonde, la valeur par défaut est parfois dépassée et l'augmentation de la valeur résout souvent le problème. Mais si ce n'est pas le cas (un nouveau message d'erreur s'affiche), vous devrez peut-être augmenter la taille de la pile de protection. Les ordinateurs stockent des informations sur les routines actives dans des piles. Parfois, lorsque les informations ne correspondent pas tout à fait à la pile, les informations sont écrites au-delà de la limite des piles, ce qui est mauvais, car cela crée généralement, par exemple, des problèmes d'accès à la mémoire. Cela peut potentiellement être corrigé en définissant l'option --max-ppsize lors du démarrage de R. C'est comme donner à un enfant un papier plus grand lorsqu'il ou elle surpasse le papier actuel et colorie également le tableau.

Pour plus d'informations, voir Wikipedia , et ses liens. Pour plus de détails sur les options de ligne de commande de R, voir An Introduction to R , section B.1.

15
user2357031

Je suppose qu'un site comme celui-ci n'est pas le bon endroit pour un cours intensif général sur l'informatique, mais dans votre cas, il y a une correspondance entre le nom du site et la question: vous rencontrez un débordement de pile! :-)

En informatique, une pile est une structure de données à laquelle vous pouvez accéder seulement son dernier élément (une demi-file d'attente, pour ainsi dire). Pour plus d'informations, voir par ex. Wikipedia ou CMU . Les piles jouent un rôle central lors de l'appel de fonctions, car l'adresse de retour et souvent les arguments de fonction y sont stockés. Le retour d'une fonction signifie simplement récupérer l'adresse de retour de la pile et continuer l'exécution du programme à partir du point de code spécifié par cette adresse.

Puisque vous appliquez récursivité dans votre code (appelant une fonction de l'intérieur de lui-même), la pile grandit à chaque nouvel appel. Finalement, votre programme manque de mémoire pour stocker la pile entière.

Voir aussi Memory dans la documentation R.

6
Igor F.