R 3.5.1包含整数64的paste()会损坏值
我一直在通过R和R 3.5.1包含整数64的paste()会损坏值,r,R,我一直在通过R和RPostgres库生成的报告中跟踪一些“不可能”的数字。代码正在运行许多数据库查询,其中一些恰好返回了BIGINT类型(通过SQLCOUNT()aggregates),默认情况下,RPostgres将其解释为integer64(我正在使用BIGINT=“integer”选项,因为目前没有任何值大于2^31) 我得到了一个非常简单的例子: i <- bit64::as.integer64(1) paste(data.frame(a=i)) 我认为这里的关键是在数据帧上调用
RPostgres
库生成的报告中跟踪一些“不可能”的数字。代码正在运行许多数据库查询,其中一些恰好返回了BIGINT
类型(通过SQLCOUNT()
aggregates),默认情况下,RPostgres
将其解释为integer64
(我正在使用BIGINT=“integer”
选项,因为目前没有任何值大于2^31)
我得到了一个非常简单的例子:
i <- bit64::as.integer64(1)
paste(data.frame(a=i))
我认为这里的关键是在数据帧上调用粘贴
,而不是单个值i
。如果将其解析为数字或整数,则返回1<代码>粘贴(data.frame(a=as.numeric(i))
我读得不够透彻,无法理解为什么有时会在数据帧上奇怪地解析因子,或者(它会改变值)。我并不是说这是事实,但它可能是相关的。我理解这种挫折感,但归根结底,事实上列表原则上可以包含任何类型的对象。事实上,您可能会争辩说,paste()
在列表对象上是毫无意义的,如果您想将列表元素粘贴在一起,您应该显式地处理对字符的强制,为了安全起见,您可以认为R应该循环遍历每个列表元素,并以正确调用可用S3方法的方式单独强制每个元素,但即使这样做,也不能保证这样的方法存在,因此,您又回到了需要程序员显式地处理它以确保完全安全的状态。当R知道这个对象的类并且在某些地方“做了正确的事情”(即,print()
将对象的值显示为1
)但其他地方选择了某种任意的字符串表示时,我觉得很惊讶