Отключить экспоненциальную запись при печати с помощью fwrite r - PullRequest
0 голосов
/ 02 мая 2018

Я столкнулся с проблемой, когда даже когда я отключаю экспоненциальную запись, 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 здесь , который я нашел после того, как задал вопрос!

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Будет ли это приемлемым решением? (Это приведет к усечению до любого десятичного уровня точности, установленного цифрой после точки.)

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

В ответе на проблему, которую вы упомянули, было предложено использовать bit64::as.integer64 из пакета, но обычная as.integer, похоже, работает здесь:

fwrite(list(as.integer(testint)))
500000
0 голосов
/ 03 мая 2018

Если вы посмотрите на исходный код функции 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 функций пакета).

...