程式邏輯結構
函數
以下透過平均數mean
mean(0:20)
## [1] 10
x<-c(2,5,8,56,NA)
mean(x,na.rm = TRUE)
## [1] 17.75
亦可自行定義函數
hell <- function(x,y) {
print("hello world")
sum <- 0
for(i in x:y) {
sum <- sum+i
}
return(sum)
}
hell(3,20)
## [1] "hello world"
## [1] 207
邏輯判斷
1.非
x <- 1
!x < 2
## [1] FALSE
x > 0
## [1] TRUE
2.和
&&及&差別在於前者能判斷單一值,後者則判斷多個值
1:3 < 2 & 3 > 2
## [1] TRUE FALSE FALSE
1:3 < 2 && 3:5 > 2
## [1] TRUE
3.或
||及|差別在於前者能判斷單一值,後者則判斷多個值
1 < 2 | 3:5 > 2
## [1] TRUE TRUE TRUE
1 < 2 || 3:5 > 2
## [1] TRUE
條件判斷
透過判斷指定的條件後,去做接下來的動作 主要以if else以及switch
x<-10
if(x<=9){
x<-x+10
}else
x<-10
x
## [1] 10
亦可寫成單行用法
x<-10
if(x<5) y<-10 else y<-1
y
## [1] 1
ifelse(1:10<=5,'NA',0)
## [1] "NA" "NA" "NA" "NA" "NA" "0" "0" "0" "0" "0"
For迴圈
必須注意的在迴圈運算中如果有用到的新變數時,必須先定義變數。
x<-sample(45:50)
for (i in x) {
print(i)
}
## [1] 46
## [1] 47
## [1] 48
## [1] 50
## [1] 49
## [1] 45
x <- 0
for(i in 1:20) {
if(i==9){break}
x <- x+i
print(x)}
## [1] 1
## [1] 3
## [1] 6
## [1] 10
## [1] 15
## [1] 21
## [1] 28
## [1] 36
x <- matrix(1:20,4,5)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
for (i in 1:length(x)) {
if(i !=1) x[i] <- (x[i] + x[i-1])/i
}
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1.000 1.275000 1.127406 1.083982 1.062764
## [2,] 1.500 1.212500 1.112741 1.077427 1.059042
## [3,] 1.500 1.173214 1.101158 1.071828 1.055739
## [4,] 1.375 1.146652 1.091763 1.066989 1.052787
While迴圈
while和for 迴圈差別在於前者是透過邏輯判斷進行循環;後者則制定一有限變數或向量物件來循環。
以下為與for迴圈一樣的簡單迴圈。
x <- 0
while(x<=7){
print(x)
x<-x+1
}
## [1] 0
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
無限迴圈就是條件是結果永遠皆為1(TRUE),則迴圈無法停止。
x <- 0 while(1){ print(x) x<-x+1 }
x <- 0
while(x<10) {
x<- x+1
if(x==8) {
print("next:no8")
next}
print(x)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] "next:no8"
## [1] 9
## [1] 10
repeat迴圈
Repeat與while相似,但後者有邏輯判斷;前者則無。
如下為最基礎的無限迴圈範例
x<-1 repeat(print(x))
x<-1
y<-0
repeat{
if(x>50) break
y<-x+y
x<-x+1
}
x
## [1] 51
y
## [1] 1275
break與next不同於前者為直接跳出迴圈,不再執行迴圈;後者則是跳出迴圈某區塊,並繼續執行下個循環。
x <- sample(1:20)
for (i in x) {
if(i>8){
print("Number > 8")
next}
if(i==5){
print("Hello")
break}
print(i)}
## [1] "Number > 8"
## [1] 8
## [1] 6
## [1] "Number > 8"
## [1] "Hello"