同时在R函数内部循环

时间:2017-02-17 17:13:25

标签: r function while-loop

我是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清楚地执行了一些计算,但我输入的测试参数并没有吐出任何模拟数据。

有什么建议吗?

1 个答案:

答案 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 ,我想你会得到你想要的东西。