Week 1
https://www.jianshu.com/p/1be2821f3929
Week 2
1 控制结构语句(Control Structures)
1.1 If-else
- If语句有两种形式,其中else语句不是必须的
if (<condition>) {
## do something
} else {
## do something else
}
if (<condition>) {
## do something
} else if (<condition>) {
## do something different
} else {
## do something different
}
- 可以直接给变量用if-else语句赋值
y <- if(x > 3) {
10
} else {
0
}
1.2 For
- 基本范式
for(i in 1: 10) {
print(i)
}
- seq_along()返回和对象等长的数列
for(i in 1:10) {
print(x[i])
}
for(i in seq_along(x)) {
print(x[i])
}
for(letter in x ) {
print(letter)
}
for(i in seq_len(nrow(x))) {
for(j in seq_len(ncol(x))) {
print(x[i, j])
}
}
- 嵌套for循环(最好不要超过三层)
x <- matrix(1:6, 2, 3)
for (i in seq_len(nrow(x)) {
for (j in seq_len(ncol(x))) {
print(x[i, j])
}
}
1.3 While
- 基本范式
count <- 0
while(count < 10) {
print(count)
count = count + 1
}
- rbinom()正态分布随机数的生成函数:rnorm(n,mean=0,sd=1) 其中n表示生成的随机数数量,mean是正态分布的均值,默认为0,sd是正态分布的标准差,默认时为1
z <- 5
while (z >=3 && z <=10) {
print(z)
coin <- rbinom(1, 1, 0.5)
if (coin == 1) { ##random walk
z <- z+1
} else {
z <- z-1
}
}
1.4 Repeat
退出一个重复循环唯一的方式是调用break
1.5 Next
next用来跳过一些迭代
for (i in 1:100) {
if (i <=20) {
##skip the first 20 iterations
next
}
## do something here
}
1.6 Return
退出循环并返回一个值
2 编写R函数(Functions)
- 所有R函数会自动返回最后一个表达式的值
- 参数定义时可以设定缺省值
above <- function(x, n = 10) { ##默认参数等于10
use <- x >n
x[use]
}
columnmean <- function(y, removeNA = TRUE) {
nc <- ncol(y) ## 数据类型integer
means <- numeric(nc) ## 转化为numeric
for (i in 1:nc) {
means[i] <- mean(y[,i], na.rm = removeNA)
}
means
}
2.1 参数(Arguments)
2.1.1 基本方法
- 形式参数是包含在函数定义里的参数,formals()查看或设置函数的形式参数
- args()查看参数名称和参数缺省值
- 可通过命名参数来快速调用参数
- R函数检查参数匹配的顺序:名称完全匹配、名称部分匹配、位置匹配
2.1.2 "..."参数
- 用来表明一些可以传递给另一个函数的参数,不用重复创建参数(另一用法是用在泛型函数中)
myplot <- function(x, y, type = "1", ...) {
plot(x, y, type = type, ...)
}
- 无法确定参数数量的时候也用"..."
> args(paste)
function (..., sep = " ", collapse = NULL)
> args(cat)
function (..., file = "", sep = " ", fill = FALSE, labels = NULL,
append = FALSE)
任何出现在"..."之后的参数需要明确地给出名称,而且不能进行部分匹配
2.1.2 惰性求值(Lazy Evaluation)
即仅在使用这个参数时求值
> f <- function(a, b) {
a^2
}
> f(2)
[1] 4
> f <- function(a, b) {
print(a)
print(b)
}
> f(45)
[1] 45
Error in print(b) : argument "b" is missing, with no default
3 作用域规则(Scoping rules)
搜索顺序全局环境->包
make.power <- function(n) {
pow <- function(x) {
x^n
}
pow
}
> cube <- make.power(3)
> square <- make.power(2)
> cube(3)
[1] 27
> square(3)
[1] 9
> ls(environment(cube))
[1] "n" "pow"
> get("n", environment(cube))
[1] 3
y <- 10
f <- function(x) {
y <- 2
y^2 + g(x)
}
g <- function(x) {
x*y
}
> f(3)
[1] 34
作用域规则在统计学中的优化也很有用(暂略,具体看课程视频)
4 时间与日期
- R里面存储日期的数据类型是Date
> x <- as.Date("1970-01-01")
> x
[1] "1970-01-01"
> class(x)
[1] "Date"
> unclass(x)
[1] 0
> unclass(as.Date("1970-01-02"))
[1] 1
- R里面存储时间的数据类型是POSIXct和POSIXIt
> x <- Sys.time()
> x
[1] "2017-11-18 15:10:32 CST"
> p <- as.POSIXlt(x)
> names(unclass(p))
[1] "sec" "min" "hour"
[4] "mday" "mon" "year"
[7] "wday" "yday" "isdst"
[10] "zone" "gmtoff"
> p$sec
[1] 32.1765
- 对时间和日期起作用的函数:weekdays()返回一周中的某一天、months()返回月份、quarters()返回季度("Q1", "Q2", "Q3", "Q4")
- strptime()字符串转换为日期与时间格式