2017-02-17 3 views
0

Ich bin ein bisschen ein Anfänger mit R, aber ich habe einige Erfahrung mit anderen Sprachen wie Python.Während Schleife innerhalb einer Funktion für R

Während ich weiß, dass es Pakete gibt, die tun können, was ich für mich tun will, möchte ich diese Programmiersprache wirklich in den Griff bekommen. Ich versuche eine Simulation einer M/M/1-Warteschlange zu erstellen und entschied, dass eine while-Schleife funktionieren würde. Ich bin jedoch ein wenig fest und hoffe auf Hilfe.

# M/M/1 queue simulator 

lambda <- 2   # arrival rate 
mu <- 3    # service rate 
duration <- 10000 # total T of the simulation 
t <- 0    # current time in the simulation 
queue <- 0   # start with empty queue 
s <- 0    # running sum for computing average queue length 

# first arrival to start process 

T1 <- rexp(1,rate=lambda) 
currentqueue <- 1 
eventsTime <- T1 
t <- T1 
nEvents <- 1  # total number of events that have occurred 


sims <- function(lambda, mu, duration, t, queue, s) 
{ 
    while (t<duration) { 
     nEvents <- nEvents+1 
     if(currentqueue>0) { 
      T1 <- rexp(1,rate=lambda+mu) 

     p <- runif(1,0,1) 
     queue[nEvents] <- currentqueue 
     currentqueue <- ifelse(p<lambda/(lambda+mu), 
          currentqueue+1, 
          currentqueue-1) 
    } else { 
     T1 <- rexp(1,rate=lambda) 
     queue[nEvents] <- currentqueue 
     currentqueue <- 1 
    } 
    t <- t+T1 
    eventsTime[nEvents] <- T1 
    s <- s+T1*queue[nEvents] 
    } 
} 

sims(2,3,10000,0,0,0) #tests the function with given parameters 

Die while-Schleife von selbst funktioniert gut und simuliert eine M/M/1-Warteschlange, wenn die Parameter für Lambda gegeben, mu, Dauer, t, Warteschlange und s. Viele Daten werden aus der Simulation generiert und in eventsTime abgelegt. Jedoch, wenn ich versuche, dies in:

sims <- function(lambda, mu, duration, t, queue, s) {} 

Ich habe Probleme. Die Funktion wird gespeichert - wenn ich nach "Sims" suche, ist es genau dort. Die von mir eingegebenen Testparameter spucken jedoch keine simulierten Daten aus, obwohl R Studio einige Berechnungen durchgeführt hat.

Irgendwelche Ratschläge?

+1

Im Allgemeinen schreiben wir Funktionen nicht in einer Weise, die Nebenwirkungen hat. d. h. wir schreiben keine Funktionen, die Variablen außerhalb der Funktion modifizieren, was Sie anscheinend zu tun versuchen. Daher gibt Ihre Funktion "sims" keine Werte explizit zurück, und alles, was Sie innerhalb der Funktion tun, ändert nur Werte im Rahmen der Funktion, nicht woanders. Sie sollten vielleicht einige grundlegende Anleitungen zum Schreiben von Funktionen in R lesen, die dieses Konzept abdecken würden. – joran

Antwort

1

Ihre sims-Funktion gibt nicht explizit einen Wert zurück, daher ist der zurückgegebene Wert der letzte berechnete Wert. (Dieses Verhalten ist sinnvoll, da eine Funktion wie function (x) x^3 nach Möglichkeit x-würfelförmig zurückgeben soll.) Bei Sims ist dieser Wert der Wert der while-Schleife und while-Schleifen werden auf NULL ausgewertet.

> x <- 0 
> a <- while(x < 100) x <- x + 1 
> a 
NULL 

Als Ergebnis wird sims immer NULL zurück:

> sims.demo <- function() { x <- 0 ; while(x < 100) x <- x + 1 } 
> a <- sims.demo() 
> a 
NULL 

Zurück eventsTime und ich denke, Sie bekommen, was Sie wollen.

+0

Was wäre, wenn ich die Warteschlange mehrmals simulieren möchte, um viele verschiedene Ereignisse zu erhalten? Ich habe das nicht von Anfang an klargestellt, also entschuldige ich mich. – wewtwewt

+0

Sie haben dieses Array am Ende der while-Schleife ausgefüllt, so dass Sie die Werte für eventsTime erhalten. Wenn Sie viele EventsTime-Arrays möchten, führen Sie eine Schleife über Sims aus. – JWLM

+0

Nur als Referenz, der Code, den Sie geschrieben haben, wird eine schreckliche Leistung haben. R ist copy on write. Wenn Sie also einen neuen Wert mit der Zuweisung 'eventsTime [nEvents]' hinzufügen, kopieren Sie das gesamte Array 'eventsTime'. Sie würden viel besser einen nativen Iterator wie Sapply oder Vapply verwenden. – JWLM

Verwandte Themen