2017-02-17 52 views
0

我是一個初學者與R,但我有一些Python的其他語言的經驗。while循環裏面的函數R

雖然我知道有些軟件包可以做我想爲我做的事情,但我想要真正掌握這種編程語言。我想要做的是創建一個M/M/1隊列的模擬,並決定一個while循環會起作用。但是,我有點卡住,希望得到一些幫助。

# 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 

本身while循環工作正常,並模擬一個M/M/1隊列,給定的λ,μ,持續時間,T,隊列,和s時的參數。大量數據從仿真中生成並放入eventsTime中。然而,當我試圖把這個:

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

我有麻煩。該功能被存儲 - 當我檢查「模擬」時,它就在那裏。但是,儘管R Studio明確執行了一些計算,但我放入的測試參數不會吐出任何模擬數據。

有什麼建議嗎?

+1

通常在R中,我們不會以具有副作用的方式編寫函數。即我們不編寫函數來修改變量_outside_函數,這正是您似乎正在嘗試做的。因此,你的'sims'函數不會顯式地返回任何值,並且你在函數內部做的所有事情只修改函數範圍內的值,而不是在其他地方。你也許應該閱讀一些關於在R中編寫函數的基本教程,這將涵蓋這個概念。 – joran

回答

1

你的sims函數沒有顯式地返回一個值,所以返回的值是最後一個計算的值。 (這種行爲是有道理的,因爲像函數(x)x^3這樣的函數應該儘可能地返回x立方體。)在sims的情況下,該值是while循環的值,while循環計算爲NULL

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

結果,市民將總是返回NULL

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

返回eventsTime,我想你會得到你想要的。

+0

如果我想多次模擬隊列以獲取大量不同的eventsTime值,該怎麼辦?我從一開始就沒有說清楚,所以我很抱歉。 – wewtwewt

+0

您將在while循環結束時填充該數組,因此返回它將爲您提供eventsTime值。如果你想要很多eventsTime數組,循環模擬。 – JWLM

+0

僅供參考,您編寫的代碼將具有可怕的性能。 R是在寫入時複製的,所以每次使用'eventsTime [nEvents]'賦值添加一個新值時,就複製整個'eventsTime'數組。你會更好地使用像sapply或vapply這樣的本地迭代器。 – JWLM