函數(shù)自己調(diào)用自己
zhang1
> zhang1 <- function(x)
+ {
+ if(x==0) # 設(shè)置終止條件嘶朱,防止死循環(huán)
+ x_sum=1
+ else
+ x_sum=x*zhang_1(x-1) #自己調(diào)用自己
+ return(x_sum)
+ }
> zhang1(5)
[1] 120
各種循環(huán)
zhang2
> ## 1度電50元,如果一個月使用超過200度匈睁,電費再加收15%桶蛔。如果電費小于1元吸祟,以四舍五入處理瑟慈。
>
> zhang2 <- function(deg, unitprice = 50)
+ {
+ net.price <- deg * unitprice
+ if (deg > 200) #如果超過200度,那么……
+ {
+ net.price <- net.price * 1.15
+ }
+ round (net.price)
+ }
> zhang2(deg = 150)
[1] 7500
> zhang2(deg = 250)
[1] 14375
zhang3
## 1度電50元屋匕,如果一個月使用超過100度葛碧,電費再加收15%,如果100度(含)以下过吻,電費八五折进泼。如果電費小于1元,以四舍五入處理。
zhang3 <- function( deg, unitprice = 50)
{
net.price <- deg * unitprice
if (deg > 100)
net.price <- net.price * 1.15 #注意形式有何不同
else
net.price <- net.price *0.85
round(net.price)
}
zhang3(80)
zhang3(100)
zhang4
# if語句可有返回值,改寫上例
zhang4 <- function(deg, unitprice = 50)
{
net.price <- deg * unitprice
adjustment <- if (deg > 100) 1.15 else 0.85 # if語句返回值
total.price <- net.price * adjustment
round(total.price)
}
zhang4(deg = 80)
zhang4(deg = 200)
zhang5
# 接上例子乳绕,更改
zhang5 <- function( deg, unitprice = 50)
{
net.price <- deg * unitprice
total.price <- net.price * if (deg >100) 1.15 else 0.85 # if語句直接應用在表達式中
round(total.price)
}
zhang5(deg = 80)
zhang5(deg = 200)
zhang6
## 1度電50元绞惦,超過120度,加收15%洋措,小于80度翩隧,減免15%。
zhang6 <- function( deg, unitprice = 50)
{
if (deg >120)
net.price <- deg * unitprice * 1.15
else if (deg < 80) # 多重判斷時可用的上
net.price <- deg * unitprice * 0.85
else
net.price <- deg * unitprice
round(net.price)
}
zhang6(70) # 注意形式有何不同
zhang6(100)
zhang6(150)
zhang7
## 1度電50元呻纹,超過100度,加收15%专缠,小于100度(含)雷酪,減免15%。有貧困證又用電小于100度涝婉,再減免3成哥力。電費又小于1元的部分,四舍五入墩弯。
zhang7 <- function( deg, poor = FALSE, unitprice = 50)
{
net.price <- deg * unitprice
if( deg > 100)
net.price <- net.price * 1.15
else
{
net.price <- net.price * 0.85
if (poor == TRUE) # 注意吩跋,嵌套的if
net.price = net.price *0.7
}
round(net.price)
}
zhang7(deg = 80)
zhang7(deg=80, poor = TRUE) # 注意,不要寫成 poor == TURE
zhang7(deg=200)
zhang7(deg=200, poor = TRUE)
zhang8
## if不能處理向量,ifelse可以
## if(邏輯判斷渔工, T表達式锌钮,F(xiàn)表達式)
ifelse(c(1,5) >3, 10, 1)
## 一度電50塊,用電100度(含)以下引矩,八五折梁丘,100度以上,電費加收15%旺韭。
zhang8 <- function(deg, unitprice = 50)
{
net.price <- deg * unitprice
net.price = net.price * ifelse((deg > 100), 1.15, 0.85) #注意用到的是ifelse
round(net.price)
}
zhang8(c(80,200))
zhang9
## switch.之前的if……else用于多重判斷值漫,這也可用switch語句悔政。注意,它不能用于向量捌蚊。
## switch(判斷挺智,表達式1赴涵,表達式2寄纵,……)判斷之后的值可能是數(shù)字或文字,如果是1,執(zhí)行表達式1,是2绷杜,執(zhí)行表達式2……如果是文字齿诉,執(zhí)行對應得的表達式。
## 1度電50元歇竟,超過120度挥唠,加收15%,小于80度焕议,減免15%宝磨。
zhang9 <- function(deg, unitprice = 50)
{
if(deg > 120) index <- 1
if(deg <= 120 & deg >= 80) index <- 2
if(deg < 80) index <- 3 # 創(chuàng)建3個索引
switch(index,
net.price <- deg * unitprice * 1.15,
net.price <- deg * unitprice,
net.price <- deg * unitprice * 0.85)
round(net.price)
}
zhang9(deg = 70)
zhang9(deg = 100)
zhang9(deg = 150)
zhang10
## for循環(huán)≈寻玻可用于向量對象的操作唤锉,格式 for(循環(huán)索引 in 區(qū)間) 單一運算指令。多個指令别瞭,則如下
## for(循環(huán)索引 in 區(qū)間) {系列運算命令}
##計算1到n的和腌紧。
zhang10 <- function(n)
{
sum_n <- 0
for(i in n) sum_n <- sum_n + i
print(sum_n)
}
zhang10(1:2)
zhang11
> ##使用內(nèi)建數(shù)據(jù)集合state.region,找出屬于“North Centra”的州有幾個。
> zhang11 <- function(n)
+ {
+ counter <- 0
+ for(i in n)
+ {
+ if(i == "North Central")
+ counter <- counter + 1
+ }
+ print(counter)
+ }
> state.region # 看一眼長啥樣
[1] South West West South West
[6] West Northeast South South South
[11] West West North Central North Central North Central
[16] North Central South South Northeast South
[21] Northeast North Central North Central South North Central
[26] West North Central West Northeast Northeast
[31] West Northeast South North Central North Central
[36] South West Northeast Northeast South
[41] North Central South South West Northeast
[46] South West South North Central West
Levels: Northeast South North Central West
> zhang11(state.region)
[1] 12
zhang12
> ##看一眼state.x77
> state.x77
Population Income Illiteracy Life Exp Murder HS Grad Frost Area
Alabama 3615 3624 2.1 69.05 15.1 41.3 20 50708
Alaska 365 6315 1.5 69.31 11.3 66.7 152 566432
Arizona 2212 4530 1.8 70.55 7.8 58.1 15 113417
Arkansas 2110 3378 1.9 70.66 10.1 39.9 65 51945
California 21198 5114 1.1 71.71 10.3 62.6 20 156361
Colorado 2541 4884 0.7 72.06 6.8 63.9 166 103766
Connecticut 3100 5348 1.1 72.48 3.1 56.0 139 4862
Delaware 579 4809 0.9 70.06 6.2 54.6 103 1982
Florida 8277 4815 1.3 70.66 10.7 52.6 11 54090
Georgia 4931 4091 2.0 68.54 13.9 40.6 60 58073
Hawaii 868 4963 1.9 73.60 6.2 61.9 0 6425
Idaho 813 4119 0.6 71.87 5.3 59.5 126 82677
Illinois 11197 5107 0.9 70.14 10.3 52.6 127 55748
Indiana 5313 4458 0.7 70.88 7.1 52.9 122 36097
Iowa 2861 4628 0.5 72.56 2.3 59.0 140 55941
Kansas 2280 4669 0.6 72.58 4.5 59.9 114 81787
Kentucky 3387 3712 1.6 70.10 10.6 38.5 95 39650
Louisiana 3806 3545 2.8 68.76 13.2 42.2 12 44930
Maine 1058 3694 0.7 70.39 2.7 54.7 161 30920
Maryland 4122 5299 0.9 70.22 8.5 52.3 101 9891
Massachusetts 5814 4755 1.1 71.83 3.3 58.5 103 7826
Michigan 9111 4751 0.9 70.63 11.1 52.8 125 56817
Minnesota 3921 4675 0.6 72.96 2.3 57.6 160 79289
Mississippi 2341 3098 2.4 68.09 12.5 41.0 50 47296
Missouri 4767 4254 0.8 70.69 9.3 48.8 108 68995
Montana 746 4347 0.6 70.56 5.0 59.2 155 145587
Nebraska 1544 4508 0.6 72.60 2.9 59.3 139 76483
Nevada 590 5149 0.5 69.03 11.5 65.2 188 109889
New Hampshire 812 4281 0.7 71.23 3.3 57.6 174 9027
New Jersey 7333 5237 1.1 70.93 5.2 52.5 115 7521
New Mexico 1144 3601 2.2 70.32 9.7 55.2 120 121412
New York 18076 4903 1.4 70.55 10.9 52.7 82 47831
North Carolina 5441 3875 1.8 69.21 11.1 38.5 80 48798
North Dakota 637 5087 0.8 72.78 1.4 50.3 186 69273
Ohio 10735 4561 0.8 70.82 7.4 53.2 124 40975
Oklahoma 2715 3983 1.1 71.42 6.4 51.6 82 68782
Oregon 2284 4660 0.6 72.13 4.2 60.0 44 96184
Pennsylvania 11860 4449 1.0 70.43 6.1 50.2 126 44966
Rhode Island 931 4558 1.3 71.90 2.4 46.4 127 1049
South Carolina 2816 3635 2.3 67.96 11.6 37.8 65 30225
South Dakota 681 4167 0.5 72.08 1.7 53.3 172 75955
Tennessee 4173 3821 1.7 70.11 11.0 41.8 70 41328
Texas 12237 4188 2.2 70.90 12.2 47.4 35 262134
Utah 1203 4022 0.6 72.90 4.5 67.3 137 82096
Vermont 472 3907 0.6 71.64 5.5 57.1 168 9267
Virginia 4981 4701 1.4 70.08 9.5 47.8 85 39780
Washington 3559 4864 0.6 71.72 4.3 63.5 32 66570
West Virginia 1799 3617 1.4 69.48 6.7 41.6 100 24070
Wisconsin 4589 4468 0.7 72.48 3.0 54.5 149 54464
Wyoming 376 4566 0.6 70.29 6.9 62.9 173 97203
##計算state.x77中的美國人口總數(shù)畜隶。
> zhang12 <- function(n)
+ {
+ zhang.sum <- 0
+ for( i in state.x77[,"Population"])
+ zhang.sum <- zhang.sum + i
+ print(zhang.sum)
+ }
> zhang12(state.x77[,"Population"])
[1] 212321
zhang13
> ## 一度電50塊。用電超過150度号胚,打8折籽慢。此外政府機關(guān)8折,公司用加收2成猫胁,普通家庭收費標準不變箱亿。
> deginfo <- c(80, 80, 200, 200)
> custinfo <- c("goverment", "company", "company", "family")
> zhang13 <- function(deg, customer, unitprice = 50)
+ {
+ listprice <- deg * unitprice * ifelse(deg > 150, 0.8, 1)
+ adj <- numeric(0) # 這個地方有意思。值為numeric(0)的對象長度為0弃秆,
+ # 假設(shè)一個對象x届惋,用length(x) == 0 來判斷對象x是不是numeric(0)
+ #還是谷歌清楚:numeric(0) returns a numeric vector of *length 0*,
+ #so when you add anything to it you get the same result (it's basically a numeric NULL)
+ for(i in customer)
+ adj <- c(adj, switch(i, goverment = 0.8, company = 1.2, family = 1))
+ finalprice <- listprice * adj
+ round(finalprice)
+ }
> zhang13(deginfo, custinfo)
[1] 3200 4800 9600 8000
zhang14
> #這事,也可以這么干
> deginfo <- c(80, 80, 200, 200)
> custinfo <- c("goverment", "company", "company", "family")
> zhang14 <- function(deg, customer, unitprice = 50)
+ {
+ listprice <- deg * unitprice * ifelse(deg > 150, 0.8, 1)
+ num.customer <- length(customer)
+ adj <- numeric(num.customer)
+ for(i in seq_along(customer)) # 賦值字符向量給一個對象菠赚,然后對其seq_along試試
+ adj[i] <- switch(customer[i], goverment = 0.8, company = 1.2, 1)
+ finalprice <- listprice * adj
+ round(finalprice)
+ }
> zhang14(deginfo, custinfo)
[1] 3200 4800 9600 8000
zhang15
> ## while循環(huán)
> ## while(邏輯表達式){系列運算指令} 如果邏輯表達式為T脑豹,循環(huán)繼續(xù),直到為F
> ## 1到n的和
> zhang15 <- function(x)
+ {
+ sum.x <- 0
+ while(x >= 0)
+ {
+ sum.x <- sum.x + x
+ x <- x-1
+ }
+ return(sum.x)
+ }
> zhang15(10)
[1] 55
zhang16
> ##1到n的和
> zhang16 <- function(x)
+ {
+ Sum.x <- 0
+ repeat
+ {
+ Sum.x <- Sum.x + x
+ if (x==0) break # 跳出循環(huán)
+ x <- x-1
+ }
+ return(Sum.x)
+ }
> zhang16(10)
[1] 55
zhang17
## break循環(huán)也可以和for循環(huán)和while循環(huán)配合衡查,可立即跳出循環(huán)瘩欺。
## 1到n的和
> zhang17 <- function(n)
+ {
+ sum.x <- 0
+ for(i in n)
+ {
+ if(sum.x + i > 3000) break
+ sum.x <- sum.x + i
+ }
+ return(sum.x) # print()也可
+ }
> zhang17(1:50)
[1] 1275
> zhang17(1:100) # 計算到72時,和是2926拌牲,到73時超范圍俱饿,break跳出,打印結(jié)果塌忽。
[1] 2926
zhang18
## next語句拍埠。和break一樣,須與if土居,即邏輯表達配合使用枣购,但next只是跳過本次循環(huán)嬉探,不是跳出循環(huán)
##1到n的偶數(shù)和
> zhang18 <- function(n)
+ {
+ Sum.x <- 0
+ for(i in n)
+ {
+ if(i %% 2 != 0) next # 關(guān)鍵步驟
+ Sum.x <- Sum.x + i
+ }
+ print(Sum.x)
+ }
> zhang18(1:10)
[1] 30
> zhang18(1:100)
[1] 2550