R,我感兴趣的01

函数自己调用自己

zhang1

> zhang1 <- function(x)
+ {  
+   if(x==0) # 设置终止条件,防止死循环
+     x_sum=1
+   else
+     x_sum=x*zhang_1(x-1) #自己调用自己
+   return(x_sum)
+ }
> zhang1(5)
[1] 120

各种循环

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表达式)
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,……)判断之后的值可能是数字或文字,如果是1,执行表达式1,是2,执行表达式2……如果是文字,执行对应得的表达式。
## 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    # 创建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循环。可用于向量对象的操作,格式 for(循环索引 in 区间) 单一运算指令。多个指令,则如下
## for(循环索引 in 区间) {系列运算命令}
##计算1到n的和。
zhang10 <- function(n)
{
  sum_n <- 0
  for(i in n) sum_n <- sum_n + i
  print(sum_n)
}
zhang10(1:2)

zhang11

> ##使用内建数据集合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中的美国人口总数。
> 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折。此外政府机关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,
+                     # 假设一个对象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循环
> ## while(逻辑表达式){系列运算指令} 如果逻辑表达式为T,循环继续,直到为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 # 跳出循环
+     x <- x-1
+   }
+   return(Sum.x)
+ }
> zhang16(10)
[1] 55

zhang17

## break循环也可以和for循环和while循环配合,可立即跳出循环。
## 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跳出,打印结果。
[1] 2926

zhang18


## next语句。和break一样,须与if,即逻辑表达配合使用,但next只是跳过本次循环,不是跳出循环
##1到n的偶数和
> zhang18 <- function(n)
+ {
+   Sum.x <- 0
+   for(i in n)
+   {
+     if(i %% 2 != 0) next # 关键步骤
+     Sum.x <- Sum.x + i
+   }
+   print(Sum.x)  
+ }
> zhang18(1:10)
[1] 30
> zhang18(1:100)
[1] 2550
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容