2017-02-17 12 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ループが正常に動作し、ラムダ、ミュー、持続時間、T、キュー、およびsのパラメータを所定のM/M/1待ち行列を、シミュレートします。多くのデータがシミュレーションから生成され、eventsTimeに入れられます。しかし、私はこれを入れようとしたときに:

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

私は問題があります。この機能は保存されています。私が「シムズ」をチェックすると、すぐそこにあります。しかし、R Studioがいくつかの計算を明確に実行しているにもかかわらず、シミュレートされたデータは吐き出されません。

アドバイスはありますか?

+1

一般に、Rでは、副作用のある方法で関数を記述しません。つまり、あなたがしようとしているような、関数の外側に変数を変更する関数を記述しません。結果として、あなたの関数 'sims'は明示的に値を返しません。関数内で行うことは関数のスコープ内の値だけを変更し、他の部分は変更しません。 Rで関数を記述するための基本的なチュートリアルを読んでください。これはこの概念をカバーします。 – joran

答えて

1

あなたのsims関数は明示的に値を返さないので、返される値は最後に計算された値です。 (function(x)x^3のような関数は、できるだけx立方体を返さなければならないので、その振る舞いは意味をなさない)。シムの場合、その値は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はwrite on writeなので、 'eventsTime [nEvents]'割り当てで新しい値を追加するたびに 'eventsTime'配列全体をコピーします。あなたはサプリーやvapplyのようなネイティブのイテレータを使う方がずっと良いでしょう。 – JWLM