Записать большие числа в файл в R - PullRequest
0 голосов
/ 15 мая 2018

Я хочу записать вектор в файл, а затем прочитать его с помощью Rstudio. Вектор включает в себя несколько больших целых чисел (числа порядка 10 ^ 40), и кажется, что он не может быть записан должным образом, так как, когда я хочу прочитать его, я получаю следующие ошибки:

"ReadList :: readn: при чтении из файла" /Users/Research/RF_improvment/testNTT.txt "обнаружен неверный действительный номер."

и

"Part :: partw: Часть 1025 из {$ Failed} не существует. Set :: partw: часть 1025 из {Mod [$ Failed + {$ Failed} [[1025]], 115792089237316195423570985008687907853269984665640564039457584007913129461761]} не существует. "

Кто-нибудь знает, как записать большие числа в файл, используя функцию записи в R? У меня нет проблем с вычислениями, и ошибки для чтения и записи в файл.

1 Ответ

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

Максимальное целое число R, с которым можно работать, можно найти следующим образом:

> .Machine$integer.max
# [1] 2147483647
>

Таким образом, никакая функция записи или чтения в R не может иметь дело с целыми числами этой величины:

# So when you compute large numbers using R
# they are computed with double precision: 
options("scipen"=400, "digits"=4)

anum <- 10^40
bnum <- 9^40

# The above numbers are no longer integers, 
# but rather floating values calculated with double precision:
str(anum)
num 10000000000000000304008240626848262428282

Если вы используете некоторые пакеты для вычисления больших степеней целых чисел, результат фактически не является целым числом:

library(gmp)
bigN <- as.bigz(2)^40
bigN
# Big Integer ('bigz') :
# [1] 1099511627776

str(bigN)
# Class 'bigz'  raw [1:20] 01 00 00 00 ...

Если, однако, цель состоит в том, чтобы сохранить эти значения в текстовом файле и затем прочитать их обратно, тогдаможно использовать следующий подход:

# Create "big" numbers using gmp package
library(gmp)
bigA <- as.bigz(10)^40
bigB <- as.bigz(9)^40

bigA
# Big Integer ('bigz') :
#  [1] 10000000000000000000000000000000000000000


#Save them as character vector:
# write them to a file
write.csv(data.frame(a=as.character(bigA), b=as.character(bigB)), "myfile.csv", row.names=FALSE)

# Let's take a look at the file
system("cat myfile.csv")
#"a","b"
#"10000000000000000000000000000000000000000","147808829414345923316083210206383297601"

# Read them back as a character strings first.
new.dt <- read.csv("myfile.csv", colClasses=c("character","character"))
str(new.dt)
# 'data.frame': 1 obs. of  2 variables:
#   $ a: chr "10000000000000000000000000000000000000000"
#   $ b: chr "147808829414345923316083210206383297601"

# Convert them back to  "bigz" objects:
bigA.new <- as.bigz(new.dt$a)
bigB.new <- as.bigz(new.dt$b)

bigA
#Big Integer ('bigz') :
#  [1] 10000000000000000000000000000000000000000
...