我已经尝试了一些方法来解决这个问题,但我对如何写它有麻烦。我想前三步我做对了,但是现在我要用y
中的数字填充向量z
这些数字可以被4整除,不能被3整除,并且是奇数位。我知道我以错误的方式使用print
函数,我只是不知道还能使用什么……这和另一个问题不同,因为我没有使用while循环。
#Step 1: Generate 1,000,000 random, uniformly distributed numbers between 0
#and 1,000,000,000, and name as a vector x. With a seed of 1.
set.seed(1)
x=runif(1000000, min=0, max=1000000000)
#Step 2: Generate a rounded version of x with the name y
y=round(x,digits=0)
#Step 3: Empty vector named z
z=vector("numeric",length=0)
#Step 4: Create for loop that populates z vector with the numbers from y that are divisible by
#4, not divisible by 3, with an odd number of digits.
for(i in y) {
if(i%%4==0 && i%%3!=0 && nchar(i,type="chars",allowNA=FALSE,keepNA=NA)%%2!=0){
print(z,i)
}
}
注意:根据@BenBolker的评论,循环是解决问题的低效方法。一般来说,在R中,尽可能避免循环以最大化代码的效率。@SymbolixAU在评论中提供了一个这样做的例子。话虽如此,为了帮助您了解循环和向量的来龙去脉,这里有一个解决方案,只需要更改一行代码:
你已经在循环之前创建了向量,这是一个很好的开始。现在,在循环中,你需要填充那个向量。要做到这一点,你现在有print(z,i)
,它不会做太多。改变vector本身需要做的:
z <- c( z, i )
应该为您工作(只需替换循环中的print
行)。
这里发生的事情是,我们将现有的z
向量,将i
绑定到它的末端,并再次生成新的向量z
。所以每增加一个值,向量就会变长一点,这样你就会得到一个完整的向量。
将print
替换为:
z <- append(z, i)