我是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清楚地执行了一些计算,但我输入的测试参数并没有吐出任何模拟数据。
有什么建议吗?
答案 0 :(得分:1)
您的sims函数未显式返回值,因此返回的值是计算的最后一个值。 (这种行为是有道理的,因为像函数(x)x ^ 3这样的函数应该尽可能返回x cubed。)在sims的情况下,该值是while循环的值,而while循环求值为{{1 }}
NULL
因此,SIM卡将始终返回> 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
,我想你会得到你想要的东西。