2014-05-18 4 views
0

나는 0.5보다 크거나 -0.5보다 작은 모든 요소를 ​​rnorm()에서 취하여 두 배로하여 벡터로 반환하는 함수를 올바르게 작성하려고합니다.IF 문 내에서 FOR 루프

zzz<-function(xxx=2){ 
    zz<-rnorm(1000) 

    maxi<-zz>0.5 
    mini<-zz<-0.5 

    for (i in 1:zz){ 
      if (maxi==TRUE | mini==TRUE){  
      yyy<-xxx*zz[i] 
      count<-append(count,yyy) 
        } 
    } 
count 
} 

저는 매우 신종입니다. 어떤 도움을 많이 주시면 감사하겠습니다. 당신은

답변

3

이 방법으로 루프를 사용하는 것은 관용적 인 R이 아닙니다. R은 벡터에 대한 산술 연산을 수행하는 데 루프가 필요하지 않은 벡터화 된 언어입니다. 표준 접근 방식을 익히려면 An Introduction to R을 읽기를 권합니다.

또한 함수 내에서 임의의 벡터를 계산하는 것이 최적이라고 생각하지 않습니다. 디버깅하기가 어렵습니다. 어쩌면 그것을 인수로 전달하고 싶을 수도 있습니다.

다음 코드는 당신이 원하는 것을 할 것입니다 :

twiddle <- function(v, multiplier = 2) { 
    ind <- which(v < -0.5 | v > 0.5) 
    v[ind] <- v[ind] * multiplier 
    return(v) 
} 

또는 더 컴팩트하게, 단지 v[abs(v) > 0.5] <- v[abs(v) > 0.5] * multiplier; return(v)로 의견에서 지적 :

v <- rnorm(5) 
v 

[1] -2.078349536 0.004373942 0.269364879 0.199779240 0.373235666 

ind <- which(v < -0.5 | v > 0.5) 
v[ind] <- v[ind] * 2 
v 

[1] -4.156699071 0.004373942 0.269364879 0.199779240 0.373235666 

는 어쩌면이 같은 기능은 의미가있다.

이렇게 요청 :

u <- rnorm(1000) 
twiddle(u) 
+2

'V [IND] <- V [IND * multiplier' – alittleboy

+0

덕분 단순히 현재 –

+0

이상의 고정'V [ABS (V)> 0.5 * multiplier' –

2

당신은 샘플 수의 인수를 요청, 다음과 같은 코드가 생성 될 시도 할 수 있습니다 감사합니다 :

my.func = function(n=1000){ 
    rn = rnorm(n) 
    good = rn[rn > 0.5 | rn < -0.5] 
    return(2*good) 
} 

실행 my.func(1000)를 벡터를 얻을 수 있습니다.