【问题标题】:While loop inside a function for R在 R 的函数内循环
【发布时间】: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


【解决方案1】:

您的 sims 函数没有显式返回值,因此返回的值是最后计算的值。 (这种行为是有道理的,因为像 function(x) x^3 这样的函数应该尽可能返回 x 立方。)在 sims 的情况下,该值是 while 循环的值,而 while 循环的计算结果为 NULL .

> x <- 0
> a <- while(x < 100) x <- x + 1
> a
NULL

因此,sims 将始终返回 NULL

> sims.demo <- function() { x <- 0 ; while(x < 100) x <- x + 1 }
> a <- sims.demo()
> a
NULL

返回eventsTime,我想你会得到你想要的。

【讨论】:

  • 如果我想多次模拟队列以获得大量不同的 eventsTime 值怎么办?我从一开始就没有说清楚,所以我道歉。
  • 您将在 while 循环结束时填充该数组,因此返回它将为您提供 eventsTime 值。如果您想要许多 eventsTime 数组,请遍历 sims。
  • 仅供参考,你写的代码性能会很差。 R 是写时复制,因此每次使用 eventsTime[nEvents] 赋值添加新值时,都会复制整个 eventsTime 数组。使用像 sapply 或 vapply 这样的原生迭代器会更好。
  • 我认为放置得当的 Reduce 也可以轻松替换该 while 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2021-07-12
  • 2019-09-15
相关资源
最近更新 更多