使用fwrite r打印时禁用指数表示法

时间:2018-05-02 20:38:44

标签: r data.table fwrite

我遇到了一个问题,即使我禁用指数表示法,fwrite也会以指数表示法打印数字。一个例子:

library(data.table)
options(scipen = 999)
testint = c(500000)

在我打印之前,r表现并且不以指数表示法打印:

print(testint)
[1] 500000
print(list(testint)
[[1]]
[1] 500000

但是当我这样做时:

fwrite(list(testint), "output")

文件内容为5e + 05。我怀疑这个问题可能特别适用于fwrite,就像我一样:

write(testint, "output1")

输出文件的内容为500000。

有没有办法阻止fwrite这样做?我可以切换到使用write,但它们之间存在巨大的速度差异,而且我正在编写大量数据,因此如果可能的话,我会避免显着的性能影响。谢谢!

编辑:如果有人有兴趣,我提出问题后就会发现现有的开放github问题here

2 个答案:

答案 0 :(得分:3)

如果查看fwrite()函数的源代码,它会将值直接传递给内部C函数:

> fwrite
function (x, file = "", append = FALSE, quote = "auto", sep = ",",
    sep2 = c("", "|", ""), eol = if (.Platform$OS.type == "windows") "\r\n" else "\n",
    na = "", dec = ".", row.names = FALSE, col.names = TRUE,
    qmethod = c("double", "escape"), logicalAsInt = FALSE, dateTimeAs = c("ISO",
        "squash", "epoch", "write.csv"), buffMB = 8, nThread = getDTthreads(),
    showProgress = getOption("datatable.showProgress"), verbose = getOption("datatable.verbose"))
{
...
    .Call(Cwritefile, x, file, sep, sep2, eol, na, dec, quote,
        qmethod == "escape", append, row.names, col.names, logicalAsInt,
        dateTimeAs, buffMB, nThread, showProgress, verbose)
    invisible()
}

如果查看被调用函数的源代码: https://github.com/Rdatatable/data.table/blob/master/src/fwrite.c 您会注意到它们不检查R中设置的任何环境,并使用重要的符号表示足够大的值。 可以按照自己喜欢的方式更改此源,构建自己的动态库并从R中调用它。 另一种选择是使用一些标准的R写函数(虽然我怀疑你喜欢 data.table 包函数的性能)。

答案 1 :(得分:1)

这是一个可接受的解决方法吗? (最终会截断到句点后数字设置的任何十进制精度级别。)

fwrite(list(sprintf("%9.2f", testint)))
500000.00

您引用的问题对此问题的回应有一个建议,即从包中使用bit64::as.integer64,但普通的as.integer似乎可以在这里工作:

fwrite(list(as.integer(testint)))
500000