Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 错误:C堆栈使用率太接近限制_R - Fatal编程技术网

R 错误:C堆栈使用率太接近限制

R 错误:C堆栈使用率太接近限制,r,R,我试图在R中运行一些相当深的递归代码,但它总是给我以下错误: 错误:C堆栈使用率太接近限制 我从CStack_info()的输出是: Cstack_info() size current direction eval_depth 67108864 8120 1 2 我的机器上有很多内存,我只是想弄清楚如何增加R的CStack 编辑:有人要求提供一个可复制的示例。下面是一些导致问题的基本示例代码。运行f(1,1)几次就会得到错误

我试图在R中运行一些相当深的递归代码,但它总是给我以下错误:

错误:C堆栈使用率太接近限制

我从
CStack_info()
的输出是:

Cstack_info()
    size    current  direction eval_depth 
67108864       8120          1          2 
我的机器上有很多内存,我只是想弄清楚如何增加R的CStack

编辑:有人要求提供一个可复制的示例。下面是一些导致问题的基本示例代码。运行f(1,1)几次就会得到错误。请注意,我已经设置了--max ppsize=500000和选项(expressions=500000),因此如果不设置这些选项,您可能会在这两件事中的一件上出错。正如你所看到的,这里的递归可以非常深入,我不知道如何让它一致地工作。谢谢

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)
}

f堆栈大小是一个操作系统参数,可根据进程进行调整(请参阅)。据我所知,您不能从R内部调整它,但是您可以在启动R之前使用
ulimit
命令从shell中调整它。它的工作原理如下:

$ ulimit -s # print default
8192
$ R --slave -e 'Cstack_info()["size"]'
   size 
8388608
8388608=1024*8192;R正在打印与ulimit-s相同的值,但以字节而不是千字节为单位

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

要对此设置进行永久性调整,请将
ulimit
命令添加到shell启动文件中,以便在每次登录时执行该命令。我不能给出比这更具体的指示,因为这取决于你到底有哪个外壳和东西。我也不知道如何登录到图形环境中(如果您没有在终端窗口中运行R,这将是相关的)。

我怀疑,不管堆栈限制如何,最终都会出现太深的递归。例如,对于lambda=Inf,f(1)无限期地导致立即递归。递归的深度似乎是一个随机游走,有一些概率r会更深,1-r会完成当前的递归。当您达到堆栈限制时,您已经完成了大量“更深”的步骤。这意味着r>1/2,并且大部分时间您将继续递归


而且,即使面对无限递归,也几乎可以导出解析解或至少是数值解。我们可以将p定义为f(1)==1的概率,在一次迭代后为“子”状态编写隐式表达式,并将其与p相等,然后求解。p可以作为从二项分布中一次抽签成功的机会。

这发生在我身上的原因完全不同。我在合并两列时意外创建了一个超长字符串:

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

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

我花了很长时间才弄明白,因为我从来没想到是浆糊造成了这个问题

正如马丁·摩根所写。。。问题是你太深入递归了。如果递归根本不收敛,您需要自己打破它。我希望这段代码能够正常工作,因为它没有经过测试。然而,这里至少应该清楚一点

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)
}
f 256){
返回(NA)
}

x我遇到了相同的问题,即接收到“C堆栈使用率太接近极限”错误(尽管是针对与上面user2045093所述应用程序不同的另一个应用程序)。我试过zwol的建议,但没有成功

令我惊讶的是,我可以通过安装最新版本的R for OS X(当前版本为3.2.3)以及最新版本的R Studio for OS X(当前版本为0.99.840)来解决这个问题,因为我正在使用R Studio


希望这也能对您有所帮助。

这里的一个问题可能是您在内部调用了
f

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=) ?
plop此错误不是由内存引起的,而是由递归引起的。函数正在调用自身。为了说明这一点,下面是两个相互调用的函数的最小示例:

change_to_factor <- function(x){
  x <- change_to_character(x)
  as.factor(x)
} 

change_to_character <- function(x){
  x <- change_to_factor(x)
  as.character(x)
}

change_to_character("1")

将系数更改为系数导致相同问题的另一种方法:

library(debug)
mtrace(lapply)

递归调用在这里并不明显。

如果使用plot,请检查要传递的列。似乎对于POSIXdt/ct列,在传递到plotly之前必须使用as.character(),否则会出现此异常

大家都知道,我突然在Windows7(64位)上遇到了R3.6.1。以前这不是问题,现在当我尝试“保存(.)”数据甚至执行“保存.image(.)”时,堆栈限制似乎无处不在。这就像序列化将这些堆栈吹走一样


我正在认真考虑回到3.6.0。没有发生在那里。

我的情况可能更为独特,但可能会帮助少数有这个确切问题的人:

我的案例与空间使用完全无关,但R给出了:
C堆栈使用率太接近限制

我有一个定义的函数,它是基本函数的升级:

saveRDS()

但是,
意外地,此定义的函数被调用为
saveRDS()
,而不是
safe\u saveRDS()

因此,超过该定义,当代码到达实际使用
saveRDS(…)
(调用原始基本版本,而不是升级版本)的行时,它给出了上述错误并将其粉碎


所以,如果您在调用某个保存函数时遇到错误,请查看您是否无意中遇到了该错误

我经常在R脚本的顶部包含一行注释掉的
源代码(“path/to/file/thefile.R”)
,例如
thefile.R
,因此我可以轻松地将其复制粘贴到终端中运行。如果我忘记注释掉这一行,我会得到这个错误,因为运行文件运行文件,文件运行文件,文件运行文件


如果这就是原因,解决方法很简单:注释掉这行。

不确定我们是否在这里列出问题,但它发生在我身上的
传单()
。 我试图映射一个数据帧,其中
date
列属于
POSIXlt
类。 更改回
POSIXct
已解决
sudo vi /etc/security/limits.conf 
* soft memlock unlimited
* hard memlock unlimited

* soft stack unlimited
* hard stack unlimited