Управление количеством десятичных цифр в печатном выходе в R

В R есть опция для управления отображением цифр. Например:

options(digits=10)

Предполагается, что результаты расчета должны быть представлены в 10 цифрах до конца R-сессии. В файле справки R определение параметра digits выглядит следующим образом:

цифры: контролирует количество цифр для печати при печати числовых значений. Это только предложение. Допустимые значения: 1... 22, по умолчанию 7

Таким образом, он говорит, что это только предложение. Что если мне нравится всегда отображать 10 цифр, а не более или менее?

Мой второй вопрос: что если мне нравится отображать более 22 цифр, то есть для более точных вычислений, таких как 100 цифр? Это возможно с базой R, или мне нужен дополнительный пакет/функция для этого?

Изменить: Благодаря предложению Jmoy, я попытался sprintf("%.100f",pi) и он дал

[1] "3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000"

который имеет 48 знаков после запятой. Это максимальный предел, который может выдержать R?

Ответ 1

Причина в том, что вы можете просто написать функцию печати, которая игнорировала значение параметра. Встроенные функции печати и форматирования используют значение options по умолчанию.

Что касается второго вопроса, так как R использует арифметику с конечной точностью, ваши ответы не точны выше 15 или 16 знаков после запятой, поэтому в целом больше не требуется. Пакеты gmp и rcdd относятся к нескольким (через interace для библиотеки gmp), но это в основном связано с большими целыми числами, а не с более десятичными знаками для ваших удвоений.

Mathematica или Maple позволит вы должны дать столько десятичных знаков, сколько пожелает ваше сердце.

EDIT:
Возможно, было бы полезно подумать о разнице между десятичными знаками и значимыми цифрами. Если вы делаете статистические тесты, которые полагаются на различия, превышающие 15-ю значимую цифру, то ваш анализ почти наверняка является нежелательным.

С другой стороны, если вы просто имеете дело с очень маленькими числами, это не проблема, так как R может обрабатывать число, меньшее .Machine$double.xmin (обычно 2e-308).

Сравните эти два анализа.

x1 <- rnorm(50, 1, 1e-15)
y1 <- rnorm(50, 1 + 1e-15, 1e-15)
t.test(x1, y1)  #Should throw an error

x2 <- rnorm(50, 0, 1e-15)
y2 <- rnorm(50, 1e-15, 1e-15)
t.test(x2, y2)  #ok

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


Как уже упоминалось в e3bo, вы можете использовать числа с плавающей запятой с несколькими точками, используя пакет Rmpfr.

mpfr("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825")

Это медленнее и интенсивнее использовать память, чем регулярные (двойная точность) векторы numeric, но могут быть полезны, если у вас плохо обработанная проблема или нестабильный алгоритм.

Ответ 2

Если вы производите весь вывод самостоятельно, вы можете использовать sprintf(), например

> sprintf("%.10f",0.25)
[1] "0.2500000000"

указывает, что вы хотите отформатировать число с плавающей запятой с десятью десятичными знаками (в %.10f если f для числа с плавающей запятой, а .10 задает десять десятичных знаков).

Я не знаю ни одного способа заставить R функции более высокого уровня печатать точное количество цифр.

Отображать 100 цифр не имеет смысла, если вы печатаете обычные числа R, поскольку наилучшая точность, которую вы можете получить, используя 64-битные двойные числа, составляет около 16 десятичных цифр (посмотрите на .Machine $ double.eps в вашей системе). Остальные цифры будут просто мусором.