Error: el uso de C stack está demasiado cerca del límite

Estoy intentando ejecutar un código recursivo bastante profundo en R y me sigue dando este error:

Error: el uso de C stack está demasiado cerca del límite

Mi salida de CStack_info() es:

 Cstack_info() size current direction eval_depth 67108864 8120 1 2 

Tengo mucha memoria en mi máquina, solo bash descubrir cómo puedo boost CStack para R.

EDITAR: Alguien pidió un ejemplo reproducible. Aquí hay un código de muestra básico que causa el problema. Ejecutando f (1,1) varias veces obtendrá el error. Tenga en cuenta que ya he configurado –max-ppsize = 500000 y opciones (expresiones = 500000) por lo que si no las establece, puede que tenga un error sobre una de esas dos cosas. Como puede ver, la recursión puede ser bastante profunda aquí y no tengo idea de cómo lograr que funcione de manera consistente. Gracias.

 f <- function(root=1,lambda=1) { x <- c(0,1); prob <- c(1/(lambda+1),lambda/(lambda+1)); repeat { if(root == 0) { break; } else { child <- sample(x,2,replace=TRUE,prob); if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1) { child[1] <- f(root=child[1],lambda); } if(child[2] == 1 && child[1] == 0) { child[2] <- f(root=child[2],lambda); } } if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1 || child[2] == 1) { root <- sample(x,1,replace=TRUE,prob); } } return(root) } 

El tamaño de la stack es un parámetro del sistema operativo, por proceso ajustable (ver setrlimit(2) ). No se puede ajustar desde R hasta donde yo sé, pero se puede ajustar desde el shell antes de iniciar R, con el ulimit . Funciona así:

 $ ulimit -s # print default 8192 $ R --slave -e 'Cstack_info()["size"]' size 8388608 

8388608 = 1024 * 8192; R está imprimiendo el mismo valor que ulimit -s , pero en bytes en lugar de kilobytes.

 $ ulimit -s 16384 # enlarge stack limit to 16 megs $ R --slave -e 'Cstack_info()["size"]' size 16777216 

Sospecho que, independientemente del límite de la stack, terminarás con recuentos que son demasiado profundos. Por ejemplo, con lambda = Inf, f (1) conduce a una recursión inmediata, indefinidamente. La profundidad de la recursión parece ser una caminata aleatoria, con alguna probabilidad de ir más profundo, 1 – r de terminar la recursión actual. Cuando alcanzas el límite de la stack, has realizado una gran cantidad de pasos “más profundos”. Esto implica que r> 1/2, y la gran mayoría de tiempo continuará recurriendo.

Además, parece que es casi posible derivar una solución analítica o al menos numérica, incluso frente a la recursión infinita. Uno puede definir p como la probabilidad de que f (1) == 1, escriba expresiones implícitas para los estados ‘secundarios’ después de una única iteración, y las iguale con p, y resuelva. p se puede usar como la posibilidad de éxito en un solo sorteo de una distribución binomial.

Esto me pasó por una razón completamente diferente. Accidentalmente creé una cuerda superlong mientras combinaba dos columnas:

 output_table_subset = mutate(big_data_frame, combined_table = paste0(first_part, second_part, col = "_")) 

en lugar de

 output_table_subset = mutate(big_data_frame, combined_table = paste0(first_part, second_part, sep = "_")) 

Me tomó por siempre para resolverlo ya que nunca esperé que la pasta causara el problema.

Me encontré con el mismo problema de recibir el error “El uso de C stack está demasiado cerca del límite” (aunque para otra aplicación distinta a la indicada por user2045093). Probé la propuesta de zwol pero no funcionó.

Para mi sorpresa, pude resolver el problema instalando la versión más nueva de R para OS X (actualmente: versión 3.2.3), así como la versión más nueva de R Studio para OS X (actualmente: 0.99.840), ya que estoy trabajando con R Studio.

Afortunadamente, esto también puede ser de ayuda para usted.

Como Martin Morgan escribió … El problema es que te metes demasiado profundo dentro de la recursión. Si la recursión no converge en absoluto, debe dividirla por su cuenta. Espero que este código funcione, porque no está probado. Sin embargo, al menos el punto debe quedar claro aquí.

 f <- function(root=1,lambda=1,depth=1) { if(depth > 256){ return(NA) } x <- c(0,1); prob <- c(1/(lambda+1),lambda/(lambda+1)); repeat { if(root == 0) { break; } else { child <- sample(x,2,replace=TRUE,prob); if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1) { child[1] <- f(root=child[1],lambda,depth+1); } if(child[2] == 1 && child[1] == 0) { child[2] <- f(root=child[2],lambda,depth+1); } } if(child[1] == NA | child[2] == NA){ return NA; } if(child[1] == 0 && child[2] == 0) { break; } if(child[1] == 1 || child[2] == 1) { root <- sample(x,1,replace=TRUE,prob); } } return(root) } 

Un problema aquí puede ser que llamas a f dentro de sí mismo

 plop <- function(a = 2){ pouet <- sample(a) plop(pouet) } plop() Erreur : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ? Erreur pendant l'emballage (wrapup) : évaluations trop profondément imbriquées : récursion infinie / options(expressions=) ?