使用 fwrite r 打印时禁用指数表示法
Disable Exponential Notation when printing with 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
这样做吗?我可以切换到使用 write
,但它们之间存在巨大的速度差异,而且我正在写入大量数据,因此我希望尽可能避免对性能产生重大影响。谢谢!
编辑:如果有人感兴趣,我在提出问题后发现了一个现有的未解决 github 问题 here!
如果您查看 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 包函数的性能)。
这是一个可以接受的解决方法吗? (它最终会截断到由句点后的数字设置的任何小数精度级别。)
fwrite(list(sprintf("%9.2f", testint)))
500000.00
对您引用的问题 yage 的回复建议使用包中的 bit64::as.integer64
,但普通的 as.integer
似乎在这里工作:
fwrite(list(as.integer(testint)))
500000
我 运行 遇到一个问题,即使我禁用指数表示法,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!
如果您查看 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 包函数的性能)。
这是一个可以接受的解决方法吗? (它最终会截断到由句点后的数字设置的任何小数精度级别。)
fwrite(list(sprintf("%9.2f", testint)))
500000.00
对您引用的问题 yage 的回复建议使用包中的 bit64::as.integer64
,但普通的 as.integer
似乎在这里工作:
fwrite(list(as.integer(testint)))
500000