RStudio 会话范围舍入 - options(digits=x) 被忽略

Posted

技术标签:

【中文标题】RStudio 会话范围舍入 - options(digits=x) 被忽略【英文标题】:RStudio session wide rounding - options(digits=x) is ignored 【发布时间】:2018-06-23 11:17:48 【问题描述】:

如何让 RStudio(可能是底层的 R)在整个会话中坚持舍入 x 小数位?

options(scipen=999)
options(digits=4)
options()['digits']    # does return $digits [1] 4

p <- dbinom(x=0:10, size=10, prob=0.1) 
p

#> [1] 0.3486784401 0.3874204890 0.1937102445 0.0573956280 0.0111602610 0.0014880348 0.0001377810 0.0000087480 0.0000003645 0.0000000090
#> [11] 0.0000000001

scipen 可以正常工作(清除科学记数法),但数字......不是。清除/重新启动会话和工作区没有任何区别,尽管运行了上述内容,但它仍然停留在那个长格式输出上,这对于临时的 in-the-head 计算来说是很糟糕的。我不想用数百个不必要的round() 语句堵塞代码,尤其是当存在解决该问题的数字时。

奇怪的是,工作区中的 p 变量确实显示了 4DP 舍入值!但这不好,我们需要在控制台上使用它们!

已在 x64 上更新到最新的 RStudio 1.1.383(R 也是新的 3.4.3),但仍然没有乐趣。

我一定遗漏了一些东西,但看不到什么 - 有人知道它为什么不粘住吗?

【问题讨论】:

来自帮助:它提到了打印数值时要打印的 "significant 数字。这只是一个建议。" ,而不是实际数字。您的小数字需要超过 4 位数字来表示它们。 p[1:4] 按您的预期工作。 您当然是对的@user20650 - 实际上,当值在该范围内(以及其他代码上)时,它确实会显示正确的舍入。奇怪的是,当实际 val 0.00000001 等时,我已经看到它将其他函数舍入到 0.0000,但在这种情况下不是。我仍然想确保全面显示指定的 sig digs,也许有人知道怎么做? 如果您希望到处都有 4 个或更多有效数字,请使用 sprintf("%.13f", dbinom(x=0:10, size=10, prob=0.1))。除非您强制,否则 R 不会打印尾随零。 顺便说一句,这完全是一个 R 问题,与 RStudio 无关。它只是一个前端,向 R 提交代码并显示输出。 sprintf 用于 C 函数的包装器确实很有用@user2554330,尽管我自然想避免像 round() 那样必须包装每个调用 - 这似乎没有必要。也感谢您的提醒 - 是的,我看到 RStudio 实际上只是将代码传递给 R 并返回。也许他们都希望对方能解决这个问题! 【参考方案1】:

已经接受了输出就是它的样子 - 并且很容易陷入期望小数位 DP 而不是有效数字 SD 的陷阱。通过选项强制 DP 会很方便,但是由于经常需要高精度(微小的 p 值等),许多值会被空白或完全错误。

所以最好还是不要强行使用 DP,而坚持使用 SD(如果图中所示的各个向量 val 分别四舍五入可能会很好,但这是对一致性的权衡)。一切都很好。

【讨论】:

以上是关于RStudio 会话范围舍入 - options(digits=x) 被忽略的主要内容,如果未能解决你的问题,请参考以下文章

在 RStudio / Interactive R 会话中因错误而停止执行

浮点舍入误差会将报告结果移动到范围内

在 R 中使用 as.numeric() 时如何避免数字舍入?

Rstudio 服务器在部署 APP 时遇到问题

Rstudio Rmarkdown编织到多个pdf?

将 sparklyr 连接到远程 spark 连接