2016-11-21 11 views
0

여기에는 샘플을 취하는 함수가 있습니다. 그러나 벡터에 찍힌 샘플을 저장하려고 애를 쓰고 있습니다. 여기 아래에있는 내 기능입니다 : 다음 어떻게 든 촬영 한 샘플이 공의의를 입력함수 결과는 벡터로 저장됩니다

x = vector(mode="numeric",length=n) 

과 0의 초기의 벡터를 만드는 시도

InvCDF = function(n, sd) { 
for (i in 1:n) { 
u=runif(1, min = 0, max = 1) 
x = sqrt(-2*(sd^2)*log(1-u)) 
print(x) 
} 
} 

는 있지만 작동하지 않습니다. 사람이 너무 행복 할 것 벡터 내 인쇄 (x)의 값을 저장과 도와주십시오 수 있다면

+0

어떤 언어이가에있다? – doctorlove

+0

이것은 사용 중입니다. R –

답변

1

당신은 X의 모든 반복을 저장하는 목록을 작성해야합니다. 그 값을 얻기 위해 필요한 함수를 호출해야합니다. 즉 xx는 결과를 저장합니다. 롤랜드 (Roland)가 제안한 것처럼 R에서 명단을 작성하는 것은 매우 느린 작업입니다. 가능할 때 벡터 라이 제이션 방식을 사용해야합니다.

InvCDF = function(n, sd) { 
    x=list() 
    for (i in 1:n) { 
     u=runif(1, min = 0, max = 1) 
     x[[i]] = sqrt(-2*(sd^2)*log(1-u))   
    } 
    unlist(x) 
} 
xx=InvCDF(100,19) 

미리 정의 할 수 있으며 루프로 사용합니다. 목록 작업보다 훨씬 빠릅니다.

x <- numeric(n) 
InvCDF = function(n, sd) { 
    for (i in 1:n) { 
     u=runif(1, min = 0, max = 1) 
     x[i] = sqrt(-2*(sd^2)*log(1-u)) 
    } 
    x 
} 
+0

아니요, 실제로 목록을 사용할 필요가 없습니다. 그리고 당신은 정말로 루프 안에서 객체를 성장 시켜서는 안됩니다. 가능한 가장 느린 작업 중 하나입니다. 'for' 루프를 절대적으로 사용하려면'x <- numeric (n)'을 사용하십시오. – Roland

+0

그래, 여기에 목록이 필요 없어. 나는 문제에 대해 충분히 생각하지 않았고 방금 OP의 코드를 수정했다. 나는 그것을 반영하기 위해 나의 대답을 편집 할 것이다. –

1

여기 루프를 사용할 필요가 없습니다. runif는 다음과 같이 벡터화 sqrt, log

InvCDF = function(n, sd) { 
    u <- runif(n, 0, 1) 
    sqrt(-2*(sd^2)*log(1-u)) 
} 

set.seed(1) # for reproducibility 
InvCDF(5, 1) 
#[1] 0.7855916 0.9647926 1.3043220 2.1855104 0.6711903