Борьба с целыми числами (максимальный целочисленный размер)
Я использовал функцию, которая требует ввода как целые числа.
Итак, я пытался читать о создании целых чисел:
y <- 3.14
as.integer(y)
[1] 3 # all cool
Все хорошо, но если у меня
x <- 1639195531833
as.integer(x)
[1] NA
Warning message:
NAs introduced by coercion
У меня было options(digits = 15)
, и это смутило меня, почему оно не работает, но на чистой сессии должно быть связано с научной нотацией.
Я также попытался обмануть R, но он не был доволен:
as.integer(as.character(x))
[1] 2147483647
Warning message:
inaccurate integer conversion in coercion
Как я могу победить научную нотацию и получить целые числа?
Ответы
Ответ 1
Максимальное целое число R может иметь значение
.Machine$integer.max
# [1] 2147483647
Это не имеет ничего общего с научной нотацией и все, что связано с тем, как на самом деле компьютер хранит числа. Текущая версия R хранит целые числа по-прежнему как 32 бит, независимо от архитектуры. В будущем это может измениться.
см. также ?as.integer
В настоящее время вы можете получить доступ к 64-битным целым числам через пакет int64
> as.integer(.Machine$integer.max)
[1] 2147483647
> # We get problems with this
> as.integer(.Machine$integer.max + 1)
[1] NA
Warning message:
NAs introduced by coercion
> # But if we use int64
> library(int64)
> as.int64(.Machine$integer.max) + 1L
[1] 2147483648
Ответ 2
Обновить до ответа Dason (не хватает репутации, чтобы сделать комментарий):
Пакет int64 теперь устарел, однако теперь есть пакет с именем bit64. Я смог добиться того же результата, используя его. Синтаксис слегка изменился с "as.int64" на "as.integer64".
т.е.
library(bit64)
as.integer64(.Machine$integer.max) + 1L
Ответ 3
кажется, что int64 уже устарел. Я использую пакет бит64, метод as.integer64()
и решу проблему. подробности относятся к здесь.
Ответ 4
Существуют классы, которые могут обрабатывать большие целые числа. Я использую int64, его виньетка здесь:
http://cran.r-project.org/web/packages/int64/vignettes/int64.pdf
Чтобы использовать это, вы просто поместите некоторое нормальное число в этот класс, тогда вы можете добавить или умножить его на порог того, что нормальное 32-битное целое число. Удачи.