为啥 formatC() 函数通过对某些特定值的强制引入 NA?
Posted
技术标签:
【中文标题】为啥 formatC() 函数通过对某些特定值的强制引入 NA?【英文标题】:Why is formatC() function introducing NA by coercion on some specific values?为什么 formatC() 函数通过对某些特定值的强制引入 NA? 【发布时间】:2020-02-27 21:50:40 【问题描述】:我正在尝试格式化数字,以便它们具有固定宽度,需要引入前导零。在这个this answer 到一个相关问题之后,我正在使用formatC
函数来实现这一点。但我得到了意想不到的结果。
例如,此代码按预期工作:
formatC(2102040015, format = "d", width = 10, flag = "0")
## [1] "2102040015"
formatC(102040015, format = "d", width = 10, flag = "0")
## [1] "0102040015"
但是当我尝试对这些数字使用相同的方法时,我得到了奇怪的结果:
formatC(2152040015, format = "d", width = 10, flag = "0")
## Warning message:
## In storage.mode(x) <- "integer" :
## NAs introduced by coercion to integer range
## [1] " NA"
formatC(2522040015, format = "d", width = 10, flag = "0")
## Warning message:
## In storage.mode(x) <- "integer" :
## NAs introduced by coercion to integer range
## [1] " NA"
经过一些测试,我得出的结论是,对于每个大于 2150000000
的数字,我都会收到此消息和 " NA"
结果。如果您能给我有关此行为的见解,我将不胜感激。提前谢谢!
【问题讨论】:
【参考方案1】:在你使用format="d"
的地方,你是在告诉 R 你将专门格式化整数。 R可以存储的最大整数是.Machine$integer.max
,通常是
.Machine$integer.max
# [1] 2147483647
超过该数量的数字将存储为浮点数。所以也许你想改用这个:
formatC(2152040015, format = "f", width = 10, flag = "0", digits = 0)
【讨论】:
谢谢@MrFlick 这完全回答了我的问题!所以我猜format = "f"
(结合digits = 0
参数)是一种更通用的方法,对吧?我想我会从现在开始使用它。以上是关于为啥 formatC() 函数通过对某些特定值的强制引入 NA?的主要内容,如果未能解决你的问题,请参考以下文章
为啥对 Python 值的引用(即函数参数)存储在 CPython 的堆栈(帧)中?