为什么很长的管道 (%>%) 语句会导致“错误:C 堆栈使用率太接近限制”?

问题描述 投票:0回答:1

开始之前:
我知道这个错误有很多线程“在那里”,但它们似乎都没有将问题缩小到非常长的管道语句。

我偶然发现很长的管道(

%>%
)语句可以触发
"Error: C stack usage is too close to the limit"
错误。

此外,我有权访问的一些机器会更早触发它,而其他机器会稍后触发它。

Ubuntu 20.04
R 4.0.5
rocker/r-ver:4.0.5
)跳跳虎稍后
Ubuntu 22.04
R 4.3.2
(
rocker/r-ver:4.3.2
) 跳跳虎早些时候

两台机器都返回

8192
,持续
ulimit -s

由于我不想在这里粘贴数百行冗余代码,因此我将给出一个示例,该示例需要进行调整以适合在本地计算机上进行个人复制。在大多数机器上,将管道重复插入

mutate()
语句大约 1000 次应该可以解决问题。

library(dplyr)

df <- data.frame(col1 = 1:10000)

df <- df %>%
  mutate(col1 = 1)

  # uncomment and copy paste below lines until about 1000 mutate() statements are used
  #mutate(col1 = 1) %>%
  #mutate(col1 = 1) %>%
  #mutate(col1 = 1) %>%

作为解决方案,我现在将长管道分解成更小的块,这样确实很容易。我仍然对该主题的更多背景感兴趣。

为什么会触发该错误?有人对此主题有一般想法吗?

r ubuntu tidyverse pipe rocker
1个回答
0
投票

简短回答参考Roland的评论:
因为很长的管道语句会创建大量函数调用堆栈

长答案
在标准 R 中,不太可能有人会嵌套数百个函数调用来创建某个输出。这是因为这样的语句很难读和写。更有可能生成中间结果,将其存储在各个变量中,并由工作流程中的下一个所需函数在下游进一步处理,从而有效地防止大量函数调用。

相反,(根据设计)很容易使用管道创建非常大的可读函数调用堆栈

%>%
(整个管道中的每一层都会增加堆栈),如果推到极端,最终可能会导致报告的错误.

© www.soinside.com 2019 - 2024. All rights reserved.