R - 使用for,while和repeat循环打印值

时间:2017-09-17 20:38:14

标签: r

我的代码又遇到了麻烦。这是问题,我现在有什么:

# 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)完美运作。

我唯一的问题是(b)while循环和(c)重复循环。他没有在课堂上做得很好,也没有做过一段时间的循环和重复循环。请帮忙。

2 个答案:

答案 0 :(得分:1)

您创建的对象m的长度为20,因此当您使用if (m > 0.1 & m <= 0.2)之类的内容进行测试时,R只测试对象中的第一项。要解决此问题,您需要使用m(循环计数器)对n进行索引。换句话说,不要在测试中使用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 :(得分: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之前