2017-02-17 51 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