星期六, 八月 18, 2012

笨办法学R编程(2)


本例将介绍R语言中的while循环和if条件。最终用它来解决Project Euler的第二个问题。除了练习之外你还需要了解一些斐波纳契数列的知识。废话不多说了,打开R控制台,跟着输入下面的代码,自行琢磨吧。

# 预备练习,while循环和if判断
x <- 1:10
print(x)
print(x[10])
print(x[-10])
 
i <- 1
while (i <= 10) {
  print(x[i])
  i <- i + 1
}
i <- 1
while (TRUE) {
  print(x[i])
  i <- i + 1
  if (i > 10) break
}
# 用循环和条件来完成前篇文章中的问题
# 可以体会到R语言向量化计算的特点。
x <- 1
sumx <- 0
while (x < 1000) {
  if (x %% 3 == 0 | x %% 5 == 0) {
    sumx <- sumx + x
    }
  x <- x + 1
}
print(sumx)
 
# Project Euler 2
# 找到4000000以下的斐波纳契数列
# 将其中的偶数进行求和
i <- 2
x <- 1:2
while (x[i] < 4e6) {
  x[i+1] <- x[i-1] + x[i]
  i <- i + 1
}
x <- x[-i]
sum(x[x %% 2 == 0])

得到的结果为4613732。使用while和if语句时要注意,其判断条件都要放在圆括号中,之后的代码段如果超过一行则要用大括号注明。

10 条评论:

  1. 谢谢。这个网站很有趣。等着4th 和8th的答案呐。结果和正确答案对不上。

    回复删除
  2. 提供一个方法,不需要x <- x[-i]这一步
    x = 1:2
    for (i in 2:1000) {
    x[i+1] = x[i-1] + x[i]
    i = i + 1
    if (x[i] > 4e6) break
    }
    sum(x[x %% 2 == 0])

    回复删除
    回复
    1. 这个方法貌似跟博主的一样,博主的那个删掉x<-[-i]也可以得到正确答案。
      两个循环出来的x[i]最后都是5702887,除2不余0,sum偶数时自动就过滤掉了~~

      删除
  3. 多谢博主,期待蜜月后更新~~~

    回复删除
  4. 为什么我把条件写在R命令好的一行上 就报错啊 :
    > x<-1
    > sumx<-0
    > while(x<1000){if(x%%3==0){sumx <- sumx +x} x<-x+1}
    错误: 意外的符号在"while(x<1000){if(x%%3==0){sumx <- sumx +x} x"里

    回复删除
    回复
    1. 有两行代码,你搞成一行,其中需要加分号,例如while(x<1000){if(x%%3==0){sumx <- sumx +x} ;x<-x+1}

      删除
  5. 你的Blob写的很有趣,作为一个R的初学者我受益良多。

    想请教一个问题,有什么相关的资料,是介绍R在实际案例的应用的。

    我是一个从事BI,数据仓库项目的研发。做了那么多年,最近越来越迷茫,很多项目最终很多是一个数据的展现,很少有数据挖掘的成果。 所以最近在学习R,想找寻一下接下来工作的突破口和学习方向。

    回复删除
    回复
    1. 你好啊,有两本书讲了很多用R做数据挖掘的例子,分别是《Data Mining with R_ Learning with Case Studies》以及《Machine Learning for Hackers》,R和数据库和BI之间有很好的交互功能,例如R可以很好的和开源BI pentaho交互。

      删除