【发布时间】:2017-07-07 07:43:05
【问题描述】:
我是 R 的初学者,但我确实对 Python 等其他语言有一些经验。
虽然我知道有些程序包可以完成我想要为我做的事情,但我想真正掌握这种编程语言。我想要做的是创建一个 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
当给定 lambda、mu、duration、t、queue 和 s 参数时,while 循环本身可以正常工作并模拟 M/M/1 队列。大量数据从模拟中生成并放入 eventsTime。但是,当我尝试将其放入:
sims <- function(lambda, mu, duration, t, queue, s) {}
我有麻烦。该功能已存储 - 当我检查“sims”时,它就在那里。但是,尽管 R Studio 明显执行了一些计算,但我输入的测试参数并没有吐出任何模拟数据。
有什么建议吗?
【问题讨论】:
-
通常在 R 中,我们不会以具有副作用的方式编写函数。即我们不编写修改函数外部变量的函数,这似乎是您正在尝试做的。因此,您的函数
sims不会显式返回任何值,并且您在函数内所做的一切只会修改函数范围内的值,而不是其他地方。您也许应该阅读一些关于在 R 中编写函数的基本教程,这些教程将涵盖这个概念。
标签: r function while-loop