如何在R Studio中解决“保护堆栈溢出”问题

16

我正在尝试使用glmnet包构建模型,但是当我运行以下代码时出现以下错误:

#library('glmnet')
x = model.matrix(response ~ ., data = acgh_frame[,c(3:ncol(acgh_frame))])

Error: protect(): protection stack overflow

我知道这是由于数据框中变量数量太多(>=26k)导致的。当我使用较少的变量时,错误不会出现。我知道如何在命令行R中解决这个问题,但我需要在R Studio中解决它,所以我想从R Studio中修复它。


2
当您使用“命令行R”时,您的修复方法是什么? - Dason
使用以下参数启动 R:R --max-ppsize 500000 - Ansjovis86
那么,你的实际问题是如何在RStudio中设置命令行选项? - Roland
或者可能是如何在R中或感兴趣的函数内指定这些选项。 - Dason
对于 Dason 是的。 对于 Roland 可能是的,如果可能的话... - Ansjovis86
3个回答

11

您可以在Rstudio的命令行参数中指定ppsize。

rstudio.exe --max-ppsize=5000000

您还可以通过.Rprofile设置表达式选项,或者在运行时使用options(expressions = 5e5)命令进行设置。

> options(expressions = 5e5)
>?options

表达式:

设置对嵌套表达式的计算数量限制。有效值为 25...500000,默认值为 5000。如果您增加了该值,则可能还需要使用更大的保护堆栈启动 R;请参阅内存中的 --max-ppsize。注意,您可能会因 C 栈溢出而导致段错误,在支持的操作系统上,您可能需要增加该限制。一旦达到限制,就会抛出一个错误。可以通过调用 Cstack_info 来查找当前正在评估的数字。

Cstack_info() - to determine current setting.s

你有没有想法为什么我在我的RStudio中运行你的代码时会出现这个错误?> rstudio.exe --max-ppsize=5000000 Error in rstudio.exe - -max - ppsize = 5000000 : object 'rstudio.exe' not found - vog
@vog 我知道这是一个旧的帖子,但你是否正确使用 cd 命令设置了目录? - Scott Hebert
我以前没有看到过“未找到对象”消息。在Windows上,您可以通过以下命令行调用rstudio.exe"C:\Program Files\RStudio\bin\rstudio.exe" --max-ppsize=5000000,由于Program Files中有空格,因此""引号很重要。您可能已经知道这一点,但为了完整起见 - 除非将其目录添加到系统设置的路径中,否则无法调用rstudio.exe而不使用完整路径。希望这有所帮助,对之前错过您的问题表示歉意。 - Technophobe01

2
根本原因是model.matrix函数,它将会 1) 使用大量内存; 和 2) 在列数足够大时抛出此错误。
尝试使用我的glmnetUtils包,可以解决这两个问题。它不是一次性构建模型矩阵,而是逐个项地构建; 它也不会尝试评估庞大的公式。这样做速度快得多,并且不会有堆栈溢出的风险。
install.packages("glmnetUtils")
library(glmnetUtils)
glmnet(response ~ ., data = acgh_frame[3:ncol(acgh_frame)])

1
我可以用这个来拟合决策树吗? - James Hirschorn
glmnet不是随机森林。 - ABCD
@SmallChess 这个问题与随机森林无关吧? - Hong Ooi
这个 bug 也是由较新的替换函数 glmnet::makeX() 引起的。因此,不是 glmnet() 调用,而是这个数据准备调用。 - CoderGuy123

-2

使用PCR或PLSR来减少您的列


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接