为了高效学习这些R知识或技巧,我想了一个办法.我发现这个方法的学习效率确实很高。
- 把这个帖子的代码全部拷贝到一个r_dummy.R文件中(包含注释和背景信息),而不是一次拷贝几条命令.
- 在rstudio里用Ctrl+R命令随时运行选中部分代码,查看结果.
- 修改代码,然后再运行查看结果.
#笨办法学R编程
# # 在倚天屠龙记中,有一人唤作火工头陀。此人练功不靠心法,只靠模仿他人招式,由外而内,自成一家。
# 练习编程也有如此的法门,不看文字描述,只观察和模仿别人的代码。
# 这样也可以由外而内学会编程。《笨办法学python》的作者Zed Shaw
# 就说过这种笨办法入门其实更简单。阳志平在他的文章《如何学习一门新的编程语言》
# 中也讲到,初学编程要在学习区刻意的大量练习,少看理论书。
# #
# # TED上一位教育家同样谈到这么一个故事,他把一个计算机扔在一个偏远的
# 印度小村子里不去管它,在那里没有上过学的小孩就能自己学会英语和计算机的用法。
# 实际上人脑是非常善于自我探索和学习的。因此本系列教程的特点就是只有演示代码加少量注释。
# 通过反复模仿和练习,揣摩代码的变化和结果,你就能自行领悟其含义,并打下坚实的编程基础。
# #
# # 本系列每篇文章的目的都是用R语言编程来解决一个Project Euler的问题。
# Project Euler是一系列由易到难的计算机编程挑战,它提供了一个平台来激发我们解决问题的灵感和思路。
# 本人写这个教程的目的有三:一是为了好玩,二是提高编程水平
# ,三是示范说明以提供给需要的R初学者。另外从R-Blogger上了解,
# 已经有两位高人用R在计算Project Euler,各位也可以参照他们的文章(博客1、博客2)。
# http://www.dataguru.cn/article-3392-6.html
#R 学习笔记《一》~《十二》----R语言初学者指南
#本文汇总了varlardoha博客里的R语言初学者指南,里面有许多基础的总结,对初期学习的帮助还不错,有兴趣可看下。
# 预备知识练习,在R控制台逐行输入观察结果
- 1:10
- 10:1
- x <- 1:10
- print(x)
- sum(x)
- x > 5
- x[x > 5]
- x > 5 & x < 8
- x > 8 | x < 3
- 10 %% 3
- 9 %% 3
- x %% 3
- x %% 3 == 0
- x[x %% 3 == 0]
- # Project Euler 1
- # 找到1000以下,所有能被3或5整除的数,将它们相加
- x <- 1:999
- sum(x[x %% 3 == 0 | x %% 5 == 0 ])
- # 预备练习,while循环和if判断
- x <- 1:10
- print(x)
- print(x[10])
- print(x[-10])
- i <- 1
- while (i <= 10) {
- print(x)
- i <- i + 1
- }
- i <- 1
- while (TRUE) {
- print(x)
- 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 < 4e6) {
- x[i+1] <- x[i-1] + x
- i <- i + 1
- }
- x <- x[-i]
- sum(x[x %% 2 == 0])
- # 预备练习,学习for循环、建立自定义函数和其它一些函数
- for (n in 1:10) {
- print(sqrt(n))
- }
- x <- c('hello','world','I','love','R')
- for (n in x) {
- print(n)
- }
- x <- seq(from=1,to=10,by=1)
- print(x)
- x <- seq(from=1,to=10,by=2)
- print(x)
- x <- seq(from=1,to=2,length.out=10)
- print(x)
- round(x)
- x > 1.5
- all(x>1.5)
- any(x>1.5)
- # 如何自定义一个求圆面积的函数
- myfunc <- function(r) {
- area <- pi*r^2
- return(area)
- }
- print(myfunc(4))
- # 同时求四个不同半径圆的面积
- r <- c(2,2,4,3)
- sapply(X=r,FUN=myfunc)
- # Project Euler 3
- # 找到600851475143这个数的最大质因子
- # 先建立一个函数以判断某个数是否为质数
- findprime <- function(x) {
- if (x %in% c(2,3,5,7)) return(TRUE)
- if (x%%2 == 0 | x==1) return(FALSE)
- xsqrt <- round(sqrt(x))
- xseq <- seq(from=3,to=xsqrt,by=2)
- if (all(x %% xseq !=0)) return(TRUE)
- else return(FALSE)
- }
- # 列出1到100的质数,看函数对不对
- x = 1:100
- x[sapply(x,findprime)]
- # 寻找最大的质因子
- n <- 600851475143
- for (i in seq(from=3, to=round(sqrt(n)), by=2)) {
- if (findprime(i) & n %% i == 0) {
- n <- n / i
- prime.factor <- i
- if (i >= n)
- break
- }
- }
- print(prime.factor)
- x <- y <- 1:9
- data <- expand.grid(x=x,y=y)
- print(data)
- z <- data$x * data$y
- # 一个九九乘法表
- z <- matrix(z,ncol=9)
- set.seed(1)
- x <- round(runif(10),2)
- print(x)
- order(x)
- x[order(x)[1]]
- which.min(x)
- x[which.min(x)]
- x[order(x)]
- y <- 1:10
- data <- data.frame(x,y)
- class(data)
- head(data)
- data[1,]
- data[,1]
- data$x
- data[order(data$x),]
- # Project Euler 4
- # 在两个三位数字的乘积中,找出最大的回文数
- # 先建立一个将数字顺序进行反转的函数
- reverse <- function(n) {
- reversed <- 0
- while (n > 0) {
- reversed <- 10 * reversed + n %% 10
- n <- n%/%10
- }
- return(reversed)
- }
- # 从大到小搜索回文数
- x <- y <- 999:100
- data <- expand.grid(x=x,y=y)
- data$prod <- data$x * data$y
- data <- data[order(data$prod,decreasing=T),]
- head(data)
- value <- data$prod
- for (i in 1:length(value))
- { isequal <- (value == reverse(value))
- if (isequal)
- { print(data[i,]) break }}
- # 预备练习
- mat <- matrix(1:12,ncol=4)
- print(mat)
- t(mat)
- colnames(mat) <- c('one','two','three','four')
- rownames(mat) <- c('a','b','c')
- print(mat)
- apply(mat,1,sum)
- apply(mat,2,sum)
- sum(apply(mat,2,sum))
- prod(apply(mat,2,sum))
- # 之前建立的判断是否为质数的函数
- findprime <- function(x) {
- if (x %in% c(2,3,5,7)) return(TRUE)
- if (x%%2 == 0 | x==1) return(FALSE)
- xsqrt <- round(sqrt(x))
- xseq <- seq(from=3,to=xsqrt,by=2)
- if (all(x %% xseq !=0)) return(TRUE)
- else return(FALSE)
- }
- x = 1:20
- prime <- x[sapply(x,findprime)]
- # 欧拉问题五,寻找最小的能被1到20所整除的数。
- # 建立分解质因子的函数
- primefactor <- function(x,prime) {
- m <- length(prime)
- fac.count <- numeric(m)
- names(fac.count) <- prime
- for (i in 1:m) {
- prime.num <- prime
- while (x %% prime.num == 0 & x !=1 ) {
- fac.count <- fac.count + 1
- x = x / prime.num
- }
- }
- return(fac.count)
- }
- # 上面的函数负责对一个20以下的数分解为多个质数之积
- # 返回每个质因子对应的自乘次数
- primefactor(18,prime)
- # 对1到20每个数进行质因子分解,形成一个表格
- result <- t(sapply(1:20,primefactor,prime))
- # 求每列的极大值
- prime.power <- apply(result,2,max)
- prod(prime^prime.power)
- seq(from =1 ,to = 4,by = 1) # style like python!
- seq(from =1 ,by = 1,to = 4)
- a<-seq(by = 1,from =1 ,to = 4)
- rep(a,8)
- rep(a,each = 8)
- rep(each = 8,a)
r_dummy.zip
(3.22 KB)
本附件包括:- r_dummy.R


雷达卡







京公网安备 11010802022788号







