2017-02-17 3 views
0

의 초보자입니다. 그러나 파이썬과 같은 다른 언어에 대한 경험이 있습니다.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) {} 

나는 문제가있다. 이 함수는 저장됩니다. "sims"를 확인할 때, 바로 그곳에 있습니다. 그러나 R Studio가 일부 계산을 명확하게 수행 했음에도 불구하고 내가 입력 한 테스트 매개 변수는 시뮬레이션 된 데이터를 토해 내지 않습니다.

어떤 조언이 필요합니까?

+1

일반적으로 R에서는 부작용이있는 방식으로 함수를 작성하지 않습니다. 즉, 우리는 변수를 수정하는 함수를 작성하지 않습니다. 함수의 외형입니다. 여러분이하려고하는 것처럼 보입니다. 결과적으로, 당신의 함수'sims'는 명시 적으로 어떤 값도 반환하지 않으며, 함수 내부에서하는 모든 것은 다른 곳이 아닌 함수의 범위 내에서만 값을 수정합니다. 이 개념을 다루는 R에서 함수 작성에 대한 몇 가지 기본 자습서를 읽어야합니다. – joran

답변

1

sims 함수는 명시 적으로 값을 반환하지 않으므로 반환 된 값은 계산 된 마지막 값입니다. (함수는 function (x) x^3와 같은 함수가 가능할 때마다 x cubed를 반환해야하므로 의미가 있습니다.) sim의 경우 해당 값은 while 루프의 값이고 while 루프는 NULL으로 계산됩니다.

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

반환 eventsTime을하고 난 당신이 원하는 것을 얻을 수있을 거라 생각 : 결과

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

, 심즈는 항상 NULL를 반환합니다.

+0

많은 eventsTime 값을 얻기 위해 큐를 여러 번 시뮬레이션하고 싶다면 어떻게해야합니까? 처음부터 명확하게하지 않았으므로 사과드립니다. – wewtwewt

+0

while 루프의 끝에서 배열을 채울 것이므로 반환하면 eventsTime 값을 얻을 수 있습니다. 많은 eventsTime 배열을 원한다면 시뮬레이션을 반복하십시오. – JWLM

+0

참고로 작성한 코드는 성능이 좋지 않습니다. R은 copy on write이므로,'eventsTime [nEvents]'할당으로 새로운 값을 추가 할 때마다 전체'eventsTime' 배열을 복사합니다. sapply 나 vapply와 같은 네이티브 반복자를 사용하는 것이 훨씬 낫습니다. – JWLM

관련 문제