2016-10-18 2 views
2

Ich versuche, ein Programm in R zu schreiben, um n Zufallszahl zu summieren. Wenn ich es jedoch für einige Zahlen versuche, wird es nicht funktionieren. Zum BeispielSumme der Zufallszahlen in 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)) 

wenn ich versuche, 10 Zufallszahlen zu summieren es gibt mir die richtige Summe, die

ist
show(random.sum(10)) 

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

[1] 50 

Allerdings, wenn ich es für den nächsten Versuch, die 5 ist, es arbeiten, werden nicht

show(random.sum(5)) 

x: 7 5 6 2 9 
[1] 529 

ich bin nicht sicher, was ich falsch

+0

Sie definieren 'x' außerhalb der Funktion, um 10 Elemente zu haben, die alle auf 100 gesetzt sind. Dann aktualisieren Sie innerhalb der Funktion' n' Elemente davon. Wenn Sie also n = 5 setzen, werden nur die ersten 5 Elemente aktualisiert. Die restlichen 5 sind immer noch auf '100' gesetzt. – SymbolixAU

+2

Neugierig, warum wir das machen wollen? – zx8754

Antwort

3

Der einfachste Weg, tue würde so etwas wie diese (aktualisiert per @ Axeman Kommentar):

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

, wo die erste „10“ ist Ihre n und min und max den Wertebereich für runif definieren.

halten auch x lokal für die Funktion:

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

Oder 'sum (Beispiel (1:10, 10, ersetzen = WAHR))'. – Axeman

+1

@Axeman Eigentlich viel besser, danke. Ich schätze, ich habe versucht, es zu nahe an OP's Original zu halten. –

1

Der Grund für Ihre Fehler ist die Variable Scoping-Regeln von R. Ihre variable x in globalen Bereich wird auf Änderung kopiert, behält aber die Dimension des globalen Erklärung. Wenn Sie nur die ersten n Elemente mit sum(x[1:n]) summieren, erhalten Sie die richtige Antwort.

Nun, das wirft die Frage auf, versuchen Sie, das globale Objekt x innerhalb der Funktion zu ändern? Wenn dies beabsichtigt ist, kann der Superassignment-Operator <<- verwendet werden. Weitere Informationen finden Sie im Abschnitt 10.5 "Zuweisungen in Funktionen".

Verwandte Themen