2017-11-20 9 views
2

この疑問はRで見つかりました。チェックとしてサンプルを再作成しようとしていて、sample関数の動作が異なる場合があることが判明しました。この例を参照してください:Rサンプル関数が1000万を超える値を返しました

# Look at the first ten rows of a randomly ordered vector of the first 10 million integers 
set.seed(4) 
head(sample(1:10000000), 10) 
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445 

# Select a specified sample of size 10 from this same list 
set.seed(4) 
sample(1:10000000), size = 10) 
[1] 5858004 89458 2937396 2773749 8135739 2604277 7244055 9060916 9490395 731445 


# Try the same for sample size 10,000,001 
set.seed(4) 
head(sample(1:10000001), 10) 
[1] 5858004 89458 2937396 2773750 8135740 2604277 7244056 9060917 9490396 731445 

set.seed(4) 
sample(1:10000001), size = 10) 
[1] 5858004 89458 2937397 2773750 8135743 2604278 7244060 9060923 9490404 731445 

私はこの千万しきい値に多くの値をテストし、(私は10以上の出力行をテストしていないために認めるが)の値が一致することがわかりました。

誰でもここで何が起こっているのか分かりますか?この1000万の数字について何か重要なことはありますか?

答えて

5

はい、特別なものがあります。1e7です。 sampleコードを見ると、sample.intが呼び出されます。あなたが?sampleで見ることができるようにと、sample.intuseHash引数のデフォルト値は&& n > 1e7あなたは1e7の上に取得するときに、デフォルトのプリファレンスがuseHash = TRUEに切り換えること

useHash = (!replace && is.null(prob) && size <= n/2 && n > 1e7) 

です。整合性が必要な場合は、に直接電話し、useHashの値を指定します。 (TRUEはメモリ効率の良い選択です。詳細については、?sampleの引数の説明を参照してください)

+1

ありがとう@Gregor。ドキュメンテーションの詳細を掘り下げてください。コードを調べた後、 'useHash = TRUE'のときに' sample'ではなく 'sample2'を呼び出します。私はまだ実際に何が起こっているのか理解しようとしています。 – alwaysnew

+0

'sample'は常に' sample.int'を呼び出します。 'sample.int'、*は' .Internal() '*を使って、' useHash'に依存してCで書かれた二つの 'sample'実装の一つを呼び出します。 '.Primitive'または' .Internal'を見ると、それはRを呼び出すRです。 'sample2'はハッシュテーブルを使ったメモリ効率のよい実装で、' sample'は小さなデータにとってより柔軟なデフォルトです。ドミニクの答えで 'pryr'を使ってそのコードを表示する方法を含む[詳細はこの質問を参照](https://stackoverflow.com/q/14035506/903061)。あなたが理解したいと思っていることがどれくらいあるのかわかりません... – Gregor

関連する問題