2016-08-19 3 views
0

Rに標準と科学の記法を組み合わせたベクトルを印刷したい。Rと同じベクトルで科学記号と標準表記を印刷する

なぜですか?読むのが簡単です。

具体的には、私は、0と1の間に激しく発散する値のベクトルを持っています。 10^-1から10^-16の大きさのオーダーのものもありますし、オーダー10^-1や-2のものは標準で印刷したい、科学的に印刷するにはもっと大きいものが好きです。

現在、私はRに1または他のことを強制することしかできません。

など。

> 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 

実用的ではありませんが、このようなOCDは次のようなものです。あなたが破損したり、フォーマットが間違っていたりして幸せでない限り、私は開発用にも勧めません。おそらく、それはいくつかの考えや会話を引き起こすでしょう。 (しかし、好奇心を抱く議論以外には実際には適していません)

関連する問題