2016-10-18 5 views
2

Rで乱数を加算するプログラムを作成しようとしています。しかし、私はいくつかの数字のためにそれを試しても動作しません。例えば 、乱数の合計R

## rm(list=ls()) 
random.sum <- function(n) { 
x[1:n] <- ceiling(10*runif(n)) 
cat("x:", x[1:n], "\n") 
return(sum(x)) 
} 
x <- rep(100, 10) 
show(random.sum(10)) 
show(random.sum(5)) 

私は10個のランダムな数字を合計しようとしたとき、私は5で、次のいずれかのためにそれをしようとすると、それは、私が

show(random.sum(10)) 

x: 1 3 10 1 3 2 8 6 7 9 

[1] 50 

で正しい合計を与えるだろう、それは、

show(random.sum(5)) 

x: 7 5 6 2 9 
[1] 529 

を動作しません私は私が間違って

+0

関数の外側に 'x'を定義して、10個の要素をすべて100に設定しています。関数の中で関数の' n'要素を更新しています。したがって、 'n = 5'を設定すると、最初の5つの要素だけが更新されます。残りの5つはまだ「100」に設定されています – SymbolixAU

+2

なぜこれをやりたいのですか? – zx8754

答えて

3

最も簡単な方法を考えやっているかわからないです

sum(sample(1:10, 10, replace = TRUE)) 

最初の「10」は、あなたのnminmaxrunifの値の範囲を定義している:(@のAxemanさんのコメントごとに更新)このようなものになります。

また、関数にローカルxを保つ:

random.sum <- function(n) { 
    x <- sample(1:10, 10, replace = TRUE) 
    cat("x:", x, "\n") 
    return(sum(x)) 
} 
+0

または 'sum(サンプル(1:10、10、replace = TRUE))'です。 – Axeman

+1

@Axeman実際にはるかに良い、ありがとう。私はそれをOPオリジナルに近づけないようにしていたと思う。 –

1

あなたのエラーの理由はR.の変数のスコープルールはグローバルスコープであなたの変数xが変更時にコピーされているが、グローバルの大きさを維持宣言。最初のn要素だけを合計してsum(x[1:n])とすれば、正しい答えが得られます。

ここで、関数内にグローバルオブジェクトxを変更しようとしていますか?それがあなたの意図なら、スーパーアロケーションオペレーター<<-を使用することができます。詳細は、Rイントロセクション10.5「関数内の代入」を参照してください。