2017-09-17 1 views
-1

코드에 다시 문제가 있습니다. 여기에 질문이 있는데 지금 당장 가지고있는 것이 있습니다 :R - for, while 및 repeat 루프를 사용하여 값 인쇄

# 2. Draw a random sample of size n=20 from a uniform distribution in 0 and 1 using 
# runif(20). Sequentially, print values using the following rules: 
#  i. Print a value if it is less than 0.3 or more than 0.8, but skip it 
#   (don’t print the value) if it is in (0.1, 0.2], 
#  ii. Skip the entire process if you find a value in [0.4,0.5]. 
# Write three separate R codes using (a) for loop, (b) while loop 
# and (c) repeat loop. 

# (a) for loop 
n = runif(20) 
for (val in n){ 
    if (val > 0.1 & val <= 0.2){ 
    next 
    } else if (val < 0.3 | val > 0.8){ 
    print(val) 
    } else if (val >= 0.4 & val <= 0.5){ 
    print(val) 
    break 
    } 
} 

# (b) while loop 
n = 1 
m = runif(20) 
while(n < 20){ 
    if (m > 0.1 & m <= 0.2){ 
    next 
    } else if (m < 0.3 | m > 0.8){ 
    print(m) 
    } else if (m >= 0.4 & m <= 0.5){ 
    print(m) 
    break 
    } 
    n = n + 1 
} 

# (c) repeat loop 
n = 1 
m = runif(20) 
repeat{ 
    if (m > 0.1 & m <= 0.2){ 
    next 
    } else if (m < 0.3 | m > 0.8){ 
    print(val) 
    } else if (m >= 0.4 & m <= 0.5){ 
    print(m) 
    break 
    } 
} 

(a) for 루프가 완벽하게 작동합니다.

내 유일한 문제는 (b) while 루프 및 (c) 반복 루프입니다. 그는 수업이나 노트에서 좋은 일을하지 않았으며 while 루프와 repeat 루프를 반복합니다. 도와주세요.

+0

자신의 말로는 자신이하고있는 일, 수행하고자하는 일 및 잘못되는 것이 무엇인지 설명 할 수 있습니까? –

+0

(1) 'm'에 대한 색인을 생성하지 않았습니다. (2)'repeat' 루프에서는 인덱스'n'을 증가시키지 않습니다. (3)'next'를 할 때 다음 명령이 루프의 최상위에 있으므로'n <- n + 1'은 * 실행되지 않습니다. –

+0

@RuiBarradas while 루프와 repeat 루프는 어떻게 수정합니까? – Renee

답변

1

작성한 객체 m의 길이는 20이므로, if (m > 0.1 & m <= 0.2)과 같은 값으로 테스트 할 때 R은 객체의 첫 번째 항목 만 테스트합니다. 이를 해결하려면 루프 카운터 인 mn으로 색인화해야합니다. 즉, 테스트에 m을 사용하지 말고 대신 m[n]을 사용하십시오. 모두 모양은 다음과 같아야합니다.

n <- 1 
m <- runif(20) 
while(n < 20){ 
    if (m[n] > 0.1 & m[n] <= 0.2){ 
    next 
    } else if (m[n] < 0.3 | m[n] > 0.8){ 
    print(m[n]) 
    } else if (m[n] >= 0.4 & m[n] <= 0.5){ 
    print(m[n]) 
    break 
    } 
    n <- n + 1 
} 

c와 유사한 접근법을 사용할 수 있어야합니다. (또한 한 부분에서 C 부분은 print(val)입니다.)

희망이 있습니다!

1

분명히 운동은 당신을 위해 그것을 밖으로 정렬하지만, 좋아, 내가 해결책을 게시 할게. 의사 난수 생성기가 결과를 재현 할 수 있도록 당신이 순서대로 초기 값을 설정해야합니다 사용될 때마다 최종 메모로

# (b) while loop 
n = 1 
m = runif(20) 
while(n <= 20){ 
    if (m[n] > 0.1 & m[n] <= 0.2){ 
    n = n + 1 
    next 
    } else if (m[n] < 0.3 | m[n] > 0.8){ 
    print(m[n]) 
    } else if (m[n] >= 0.4 & m[n] <= 0.5){ 
    print(m[n]) 
    break 
    } 
    n = n + 1 
} 

# (c) repeat loop 
n = 0 
m = runif(20) 
repeat{ 
    if(n < 20) 
    n <- n + 1 
    else 
    break 
    if (m[n] > 0.1 & m[n] <= 0.2){ 
    next 
    } else if (m[n] < 0.3 | m[n] > 0.8){ 
    print(m[n]) 
    } else if (m[n] >= 0.4 & m[n] <= 0.5){ 
    print(m[n]) 
    break 
    } 
} 

. 이것은 다음과 같이 수행됩니다

set.seed(6019) # or any other value, 6019 is the seed 

runif에 전에 첫 번째 통화를 을 배치됩니다.

+0

루이, 고맙습니다. 저는 직접 반복 루프를하고 있었는데 어떻게 n = 0으로 설정 했습니까? – Renee

+0

@Renee이 경우에는 루프 상단에서 'n'을 증가시킵니다. 이는 'while'과 달리 'repeat'가 조건에서 끝나지 않으므로 먼저 조건을 검사해야하기 때문입니다. –

관련 문제