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

注意区别

  1. if (条件) {命令组1}
    else {命令组2}
  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
}
R编程基础

使用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 <- 3
x^2 + 4x
x <- x – f / f.prime
f <- x^3 + 2
x^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 <- 3
x^2 + 4*x
x <- x – f / f.prime
}
x

(未更新完……)