Максимальное целое число 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