2016-08-19 57 views
0

我希望R使用標準和科學記數法混合打印矢量。在R的相同矢量中打印科學和標準符號

爲什麼?它更容易閱讀。

具體來說,我有一個向量值0和1之間的狂野發散值;一些範圍從10^-1到10^-16的數量級,我希望10^-1或-2的訂單能夠以標準打印,而那些打印在科學上的打印量要大得多。

目前我只能強迫R做1或其他。

E.g.

> rrr <- c(0.12, 0.01333, 0.0000000000000003856) 
> rrr 
[1] 1.200e-01 1.333e-02 3.856e-16 

> options(scipen = 12) 
> rrr 
[1] 0.1199999999999999956 0.0133299999999999998 0.0000000000000003856 

所以scipen似乎適用於整個載體中,而不是每個元素。同樣,改變例如options(digits = 2)只是四捨五入的最小數量,0.00000000000000039

我想看到的是

> rrr 
[1] 0.12 0.013333 3.856e-16 

的思考?

謝謝,你們都是傳奇閱讀這件事!

[此外,我不明白的未舍入行爲時scipen = 12,但這是另一個問題...]

+1

如果可以將值作爲字符串來確定,那麼以下方法適用於您:設置'options(scipen = 5)'來控制這些數字將以科學記數法表示,然後'sapply(rrr,function(x)as.character(x))' – steveb

+0

謝謝@steveb,不理想,但可行 –

+0

您最終想做什麼?我的建議只是爲了顯示,如果你想R自動選擇性地使用(或不使用)科學記數法,但保留它們作爲數值,我不認爲R現在可以做到這一點。 – steveb

回答

3

這肯定是一個黑客,這是不完全的引導:將「真棒」的方式這個函數的行爲與大多數基於S3的函數一樣,並且在數字對象被「打印」時實際上會被調用。

此外,它還遠遠沒有完成。在這種情況下,它假設了一個向量,並沒有考慮到控制檯寬度,等距等事情。

但是這是一個開始(「玩」的例子),展示了一個「可能」方法處理這樣的強迫症:-)

options(scipen2 = 3) 
print.numeric <- function(x, ...) { 
    scipen2 <- getOption("scipen2", default = 3) 
    cat(c(ifelse(abs(log(x, 10L)) >= scipen2, 
       format(x, digits = 5, scientific = TRUE), 
       format(x, digits = 1, scientific = FALSE)), 
     "\n")) 
} 

print(c(101, NA, pi/100, pi/10000, 1/100, pi * 10000)) 
# 101.0000 NA  0.0314 3.1416e-04  0.0100 3.1416e+04 

我不建議將此用於生產用途。我甚至不推薦將它用於開發用途,除非您很高興容易破損,格式不正確等。也許會引發一些想法和/或對話。 (但它確實不適合討論好奇心之外的其他任何東西。)