R编程基础
条件语句
避免除零或负数的对数等数学问题
形式1
if (条件) 表达式1 else 表达式2
if (条件) 命令1 else 命令2
形式2
ifelse (条件, yes, no)
形式1
x=-4:6
if(x >0) sqrt(x) else NA
[1] NA
Warning message:
In if (x > 0) sqrt(x) else NA : 条件的长度大于一,因此只能用其第一元素
!判断时,仅拿第一元素判断,成立则进行后面的条件运算
y=4:6
if(y>0) sqrt(y) else NA
[1] 2.000000 2.236068 2.449490
Warning message:
In if (y > 0) sqrt(y) else NA : 条件的长度大于一,因此只能用其第一元素
形式2
x=-4:6
ifelse(x>0, sqrt(x), NA)
[1] NA NA NA NA NA 1.000000 1.414214 1.732051
[9] 2.000000 2.236068 2.449490
Warning message:
In sqrt(x) : 产生了NaNs
!使用所有元素进行条件运算
y=4:6
ifelse(y>0, sqrt(y) , NA)
[1] 2.000000 2.236068 2.449490
另外可以写成
x=-4:6
sqrt(ifelse(x>0, x, NA))
[1] NA NA NA NA NA 1.000000 1.414214 1.732051
[9] 2.000000 2.236068 2.449490
注意区别
- if (条件) {命令组1}
else {命令组2} - if (条件) {
命令组1
} else {
命令组2
}
第一种方式可能出错(在直接输入命令时!)
循环语句: for()
使用场合:知道循环次数
形式
for (变量 in 向量) 表达式/命令
for (变量 in 向量) {
命令组
}
例:求费氏数列的前12项
Fibonacci <- rep(0, 12)
Fibonacci[1] <- Fibonacci[2] <- 1
for(i in 3:12) Fibonacci[i] <- Fibonacci[i-1] + Fibonacci[i-2]
Fibonacci
[1] 1 1 2 3 5 8 13 21 34 55 89 144
循环语句: while()
使用场合:无法知道运行次数
形式:
while(条件) 表达式/命令
while(条件) {
命令组
}
Fib1 <- 1; Fib2 <- 1
Fibonacci <- c(Fib1, Fib2)
while(Fib2 < 300) {
Fib3 <- Fib1 + Fib2
Fibonacci <- c(Fibonacci, Fib3)
Fib1 <- Fib2
Fib2 <- Fib3
}
Fibonacci
[1] 1 1 2 3 5 8 13 21 34 55 89 144 233 377
循环语句: repeat
使用场合:重复使用某个/组命令
形式:
repeat 表达式/命令
repeat {
命令组
}
repeat{
print(1:i)
i <- i+1
if(i > 5) break
}
[1] 1 2 3 4 5 6
Break语句
跳出for, while, repeat循环体
repeat循环体中break命令是必不可少的!
练习:
产生一个与x <- c(1,-1,5,0,5,14,15,5)同长度的向量y, 对于x中值为5的元素,y的对应元素为0,其余为1
x <- c(1,-1,5,0,5,14,15,5)
y <- rep(1, length(x))
for(i in 1:length(x)) {
if(x[i]==5) y[i] <- 0
}
使用while()
x <- 1.2
f <- x^3 + 2x^2 - 7
tolerance <- 0.0001
ind <- 1 #step counter
while(abs(f) > tolerance) {
ind <- ind + 1
f.prime <- 3x^2 + 4x
x <- x – f / f.prime
f <- x^3 + 2x^2 – 7
}
x
ind
使用repeat
x <- 1.2
tolerance <- 0.0001
repeat{
f<- x^3 + 2x^2 - 7
if(abs(f) < tolerance) break
f.prime <- 3x^2 + 4*x
x <- x – f / f.prime
}
x
(未更新完……)