2012-11-26 9 views
11

ベクトルの長さ、データフレームの行数、または行列の次元数をテストする場所で、Rコードを書くことがよくあります。たとえば、if (length(myVector) == 1)です。いくつかの基底Rコードを掘り下げながら、このような比較の値が整数で明示的に指定されていることに気付きました。通常、接尾辞は「L」、たとえばif (nrow(data.frame) == 5L)です。明示的な整数は、関数引数の場合にも使用されることがあります。例えば、cor関数の文は、x <- matrix(x, ncol = 1L)apply(u, 2L, rank, na.last = "keep")です。いつ整数を明示的にRに指定すべきですか?整数を指定しないことによる潜在的な悪影響はありますか? 1Lなどを使用して整数を明示的に指定する必要があるのはいつですか?

+1

http://stackoverflow.com/q/7014387/602276と非常によく似ています。あなたの質問に非常によく答える、受け入れられた答えをespcially参照してください。 – Andrie

+0

@ Andrie-質問と回答を指摘していただきありがとうございます。なぜ私の最初の検索でそれが出てこないのか分かりません。 – pistachionut

答えて

2

は、それが何を意味するかについての明示的のように、プログラム的に安全であり、かつ任意の変換などに依存しない

対話的にコードを書くとき、エラーに気づくと一緒に解決するために簡単にすることができますところで、あなたがパッケージ(たとえ基底R)を書いているのであれば、明示的にする方が安全でしょう。

浮動小数点数を使用すると、等価性を考慮する場合、精度問題が発生しますSee this FAQ

整数を明示的に指定すると、nrowlengthのようになり、インデックス引数はapplyに戻り、整数が必要です。

6

あなたが尋ねた:

は 整数を指定していないから、任意の潜在的な負の影響がありますか?

もっと問題になる可能性がある状況があります。データ分析 P193用チャンバーソフトウェアからの整数の絶対値が2未満^ M、 分数の長さとして

整数値は、正確 限り、「二重」の数字として表されます表現の一部(32ビットマシンでは2^54)。しかし

> (seq(-.45,.45,.15)*100)[3] 
[1] -15 
> (seq(-.45,.45,.15)*100)[3] == -15L 
[1] FALSE 

は、それが明示的でタイピングの例を思い付くするのは難しいです:

それはあなたが値を算出した場合、それは整数のように見えるではなく、かなり一つである可能性があるかを確認することは難しいことではありません整数であり、浮動小数点表現ではそれほど整数ではありませんが、Chambersが説明しているより大きな値に入るまではそうです。

+0

「32ビットマシンでは64ビットの倍数について書いていると思う」 –

+0

32ビットマシンで64ビットを2倍にしないでください(たとえば、2つの32ビットメモリの場所)。 –

+0

確かに彼らはそうです。 64ビットマシンでも64ビットを使用します。 –

関連する問題