2017-03-10 3 views
0

Noch neu in R so zu versuchen, das Arbeiten mit Funktionen zu üben, habe ich etwas (wahrscheinlich ziemlich ineffizienten) Code erstellt, den ich später ändern werde, derzeit gibt es das Ergebnis, das ich brauche, aber ich möchte die Simulation 100 Mal innerhalb wiederholen Funktion selbst. Dies würde effektiv drehen wird [i], die zurückgibt Ziele -1 oder 1 mit einer bestimmten Funktion Wahrscheinlichkeit:Infinite Rekursionsfehler - wie zu lösen?

game = function(n,pr) { 
turn = cumsum(2*rbinom(n,1,prob=pr)-1) 
bankrupcy.test = which(turn == -25) 
winner.test = which(turn == 50) 
if(length(bankrupcy.test)==0){bankrupcy.test=c(0)} 
if(length(winner.test)==0){winner.test=c(0)} 
if(bankrupcy.test==0 && winner.test==0){turn[n]}else 
if(bankrupcy.test[1]>winner.test[1]){-25}else{ 
50} 
return(replicate(100,game(n))) 
} 

Ich habe versucht, einen for-Schleife zu schaffen, aber ich nicht zu Struktur scheinen kann das richtig, also ich bin auf der Suche Um den Befehl replicate innerhalb der von mir erstellten Funktion zu verwenden, erhalte ich folgende Fehlermeldung:

"zu tief verschachtelte Auswertung: unendliche Rekursion/Optionen (Ausdrücke =)? Fehler während der Nachbearbeitung: Auswertung zu tief verschachtelt: unendliche Rekursion/Optionen (Ausdrücke =) "

Wohin gehe ich falsch? Ich möchte einen Vektor mit 100 Ergebnissen der obigen Simulation zurückgeben, in dem das Spiel gespielt wird, bis 50 Gewinn gemacht wird oder ein Verlust von 25 gemacht wird, je nachdem was zuerst eintritt. Wenn keines der vorherigen Ergebnisse auftritt, wird der endgültige Wert des Vektors genommen.

+1

Sie rufen 'game' aus dem Inneren der Funktion, und so' game' landet selbst aufrufen. Dies verursacht die Rekursion. –

+0

Ich dachte, dass das der Fall sein könnte, aber wie sonst kann ich die Simulation innerhalb der Funktion replizieren? Ist der einzige Weg eine For-Schleife? Ich kann nie scheinen, dass diejenigen arbeiten, wenn die Funktion sogar ein wenig kompliziert wird ... – Aesler

+0

gibt es einen Grund, warum Sie die Replikation innerhalb der Funktion wollen? Wenn du die 'return (replicate (100, game (n)))' und dann außerhalb der Funktion run 'replicate (100, game (n = n, pr = pr)) entfernst, sollte es funktionieren (aber vielleicht nicht Ich verstehe, was Sie versuchen zu tun) – Lucy

Antwort

1

Try this:

n <- 1000 
pr <- 0.50 

game <- function(n, pr) { 
    result = 
    replicate(100, {{turn = cumsum(2*rbinom(n, 1,prob=pr)-1) 
     bankrupcy.test = which(turn == -25) 
     winner.test = which(turn == 50) 
     if(length(bankrupcy.test)==0){bankrupcy.test = 0} 
     if(length(winner.test)==0){winner.test = 0} 
     if(bankrupcy.test==0 && winner.test==0){turn[n]} else 
     if(bankrupcy.test[1]>winner.test[1]) {-25} else {50} 
     }}) 
    return(result) 
} 

game(n, pr) 
+0

Danke, das ist das Ergebnis, das ich suche, das einzige Problem bekommt die "Funktion innerhalb einer Funktion", um den 100-Wert-Vektor zurückzugeben, wenn ich Spiel (1000, 0,5) schreibe. Sobald ich versuche, das in den geschweiften Klammern zu tun, kommen immer wieder Fehler ins Spiel. – Aesler

+0

Siehe meine Bearbeitung. Ich habe die 'replicate' Funktion in die' game' Funktion verschoben. Es ist nicht notwendig, die gleiche Funktion rekursiv aufzurufen, und was auch immer diese Funktion später tun muss, hat Zugriff auf das Ergebnis. :) –

+0

Für eine gute Übung ist es wahrscheinlich besser, den Code innerhalb der geschweiften Klammern in eine eigene Funktion mit einem anderen Namen zu verschieben und dann die 'Spiel'-Prozedur diese Funktion aufrufen zu lassen. Und auch, um die Anzahl der Simulationen dynamisch zu machen, aber es funktioniert. –