2012-12-29 32 views
9

Próbuję osiągnąć, aby wszystkie wydrukowane liczby były wyświetlane z maksymalną liczbą cyfr 7. Oto przykłady tego, co chcę, drukowane:Zatrzymywanie dużej liczby zera, które są drukowane (notacja naukowa)

0,000000 (w stosunku do rzeczywistej liczby, która jest +0,000000000029481 .....)

0.299180 (w stosunku do rzeczywistej liczby, która jest +0,299180291884922 .....)

Odniosłem sukces z tymi ostatnimi typami liczb, używając options(scipen=99999) i options(digits=6). Jednak w poprzednim przykładzie zawsze będzie drukowana ogromna liczba zer, a następnie pięć niezerowych cyfr. Jak zatrzymać to działanie i osiągnąć pożądany wynik?? Ja również nie chcę notacji naukowej.

Chcę to zastosować do WSZYSTKICH wydrukowanych numerów w KAŻDYM kontekście. Na przykład, jeśli mam jakąś matrycę, nazwij ją A, a ja wydrukuję tę macierz, chcę, żeby każdy element miał po prostu 6-7 cyfr. Chcę, żeby to było automatyczne dla każdego wydruku w każdym kontekście; podobnie jak przy użyciu options(digits=6) i options(scipen=99999) czyni automatycznym dla każdego kontekstu.

+0

Co zrobić, jeśli masz dużą liczbę, na przykład 123456789.87654321. Jak możesz wydrukować go przy użyciu maksymalnie 7 cyfr, jeśli nie zamierzasz używać notacji naukowej ?! – flodel

+0

@flodel Dobra uwaga. Może chciałbym, aby te bardzo duże liczby używały notacji naukowej (lub wykraczały poza 6 cyfr). Ale jeśli istnieje tylko rozwiązanie, które obcina KAŻDEGO głupka, należy zrobić 6-7 cyfr; to dobrze, ponieważ nigdy nie pracuję z dużymi liczbami, które muszę wydrukować w konsoli R. – Jase

Odpowiedz

3

Czy wszystkie twoje numery to < 1? Możesz wypróbować prosty sprintf("%.6f", x). W przeciwnym razie możesz spróbować owijać rzeczy do numeru sprintf na podstawie liczby cyfr; sprawdź ?sprintf pod kątem innych szczegółów.

+0

Chcę to automatycznie zastosować do każdego wydruku numeru; rozwiązanie, które jest podobne do 'options (digits = 6)' w tym, że odnosi się do każdego obiektu w każdym kontekście i muszę go ustawić * raz *. Nie wszystko jest <1, ale wszystko * co muszę wydrukować interaktywnie * wynosi <100. – Jase

10

Możesz zdefiniować nową metodę drukowania dla typu, który chcesz wydrukować. Na przykład, jeśli wszystkie numery są dwuosobowe, można utworzyć

print.double=function(x){sprintf("%.6f", x)} 

Teraz podczas drukowania podwójne (lub wektor deblu), funkcja zostanie wywołana print.double() zamiast print.default().

Może być konieczne utworzenie podobnych funkcji print.integer(), print.complex() itp., W zależności od typów, które należy wydrukować.

Aby powrócić do domyślnej metody drukowania, po prostu usuń funkcję print.double().