r recursion stack-overflow

Explicación de R: opciones(expresiones=) a científicos no informáticos



recursion stack-overflow (2)

Cortando algunas esquinas aquí ... La expresión -option establece el número máximo de expresiones anidadas que se evaluarán. Con recursión profunda, a veces se excede el valor predeterminado, y aumentar el valor a menudo resuelve el problema. Pero si no lo hace (aparece un nuevo mensaje de error), es posible que deba aumentar el tamaño de la pila de protección. Las computadoras almacenan información sobre las rutinas activas en las pilas. A veces, cuando la información no se ajusta a la pila, la información se escribe más allá del límite de las pilas, lo que es malo, ya que normalmente crea, por ejemplo, problemas de acceso a la memoria. Esto se puede corregir mediante la configuración de la opción --max-ppsize al iniciar R. Es como darle a un niño un papel más grande cuando él o ella sobregira el papel actual, y colorea la mesa también.

Para obtener más información, consulte Wikipedia y sus enlaces. Para obtener más información sobre las opciones de línea de comando de R, consulte Introducción a R , sección B.1.

He escrito una función recursiva de la forma

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

length(vars) es alrededor de 1500. Cuando lo ejecuto, recibí el error

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

Muy bien, así que aumenté

options(expressions=10000)

Entonces funciona

Pero cuando leo el documento de ayuda de options respecto a expressions= , simplemente no entiendo lo que está diciendo. Además, sugiere

... Si lo aumenta, es posible que también desee iniciar R con una pila de protección más grande; ...

Entonces, ¿alguien puede decirme qué está pasando, si debería haber aumentado los parámetros de expressions como lo hice, y si debería modificar algo más junto con él?


Supongo que un sitio como este no es el lugar adecuado para un curso intensivo general sobre informática, pero en su caso existe una coincidencia entre el nombre del sitio y la pregunta: ¡está experimentando un desbordamiento de la pila! :-)

En informática, una pila es una estructura de datos donde solo se puede acceder a su último elemento (una media cola, por así decirlo). Para obtener más información, véase, por ejemplo, Wikipedia o CMU . Las pilas juegan un papel central al llamar a las funciones, porque la dirección de devolución y, a menudo, los argumentos de función se almacenan allí. Regresar de una función simplemente significa recuperar la dirección de retorno de la pila y continuar la ejecución del programa desde el punto en el código especificado por esa dirección.

Dado que está aplicando recursividad en su código (llamando a una función desde su interior), la pila crece con cada nueva llamada. Finalmente, su programa se queda sin memoria para almacenar toda la pila.

Consulte también Memory en la documentación de R.