为什么 deparse 函数中的 width.cutoff 参数限制为 500 字节?

Mic*_*sco 7 r

为什么width.cutoff参数deparse限制为 500 字节?

考虑以下可重现的示例:

a <- substitute(12345.6789 * x0 + 123523.623529 * x1 + 1235235.6734636 * x2
     + 657567.6756756 * x3 + 756765.23523 * x4 + 54645.65464 * x5)
deparse(a)
[1] "12345.6789 * x0 + 123523.623529 * x1 + 1235235.6734636 * x2 + "
[2] "    657567.6756756 * x3 + 756765.23523 * x4 + 54645.65464 * x5"
Run Code Online (Sandbox Code Playgroud)

默认值width.cutoff60,这意味着该函数将尝试将字符串分割成60块字符。如果将参数指定为上述整数500,则会出现以下错误:

deparse(a, width.cutoff = 501)
[1] "12345.6789 * x0 + 123523.623529 * x1 + 1235235.6734636 * x2 + "
[2] "    657567.6756756 * x3 + 756765.23523 * x4 + 54645.65464 * x5"
Warning message:
In deparse(a, width.cutoff = 501) :
  invalid 'cutoff' value for 'deparse', using default
Run Code Online (Sandbox Code Playgroud)

由于担心在内存中存储大量字符串,我可以理解默认值是否设置为 60。但是,我不明白为什么不允许我将此参数设置为1000or 10000。为什么 deparse 可以在单个字符串中返回的字符数有上限?

R 可以清楚地创建一个超过 500 个字符的字符串。

nchar(paste(rep('a', 1000), collapse = ''))
[1] 1000
Run Code Online (Sandbox Code Playgroud)

我试图通过访问 github 上的源代码来了解发生了什么。我发现了这个搞笑的评论

先前关于全局“cutoff”变量的问题现在通过创建一个 deparse1WithCutoff() 例程来实现,该例程从调用者处获取中断并将其作为 LocalParseData 结构的成员传递给不同的例程。对 deparse1() 例程的访问保持不变。这正是罗斯所建议的......

一种可能的解决方法是使用另一个将截止值作为参数的函数来重构代码。然后“do_deparse”和“deparse1”都可以用适当的参数调用这个更深层次的函数。我想知道为什么我不这样做?——这会比写这篇笔记更快。我想这需要更多的思考......

在我深入研究源代码之前,有人可以向我解释为什么这个论点有上限吗?谢谢。