首页 > 解决方案 > 使用 fwrite r 打印时禁用指数表示法

问题描述

我遇到了一个问题,即使我禁用指数符号,也会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这样做吗?我可以切换到 using write,但它们之间的速度差异很大,而且我正在写入大量数据,因此如果可能的话,我希望避免对性能产生重大影响。谢谢!

编辑:如果有人感兴趣,在我提出问题后我发现这里有一个现有的开放 github 问题!

标签: rdata.tablefwrite

解决方案


如果您查看 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包函数的性能)。


推荐阅读