---
title: "R编程浅述"
output: 
  html_document:
    number_sections: TRUE
    toc: TRUE
    toc_float: TRUE
    code_folding: show
    fig_width: 7
    fig_height: 4.5
    theme: united
    highlight: tango
---


<font size=4 face="微软雅黑">

#R对象命名
***
&emsp;&emsp;用R进行编程，书写代码时，有些特殊的字符、符号等不被系统识别。

&emsp;&emsp;1)在对象命名时，不能当做对象名称的有：break/else/FALSE/for/function/if/Inf/NA/NaN/next/repeat/return/TRUE/while等。它们有特别的用法或不符合R编程规则，故不能作为对象名称。

&emsp;&emsp;2)R对英文大小写字母十分敏感，因此FF和Ff视为两个不同的对象，最终运行结果也不相同。

&emsp;&emsp;3）对象名称开头必须是英文字母或点号（"."）,当以点号（"."）开头时，接续的第二个字母不能是数字。

&emsp;&emsp;4）对象名称只能包含字母、数字、底线（"_"）和点号（"."），涉及其它可能会导致错误。
`

#R代码简化
***
&emsp;&emsp;R的代码在使用过程中可以进行一定的简化，减少不必要的流程。举例说明，需要计算1+2+3+4+11+12+13+14+21+22+23+24+31+32+33+34的和，如下所示：

&emsp;&emsp;方法一：可以在R中进行逐个输入，进行求和计算，如下所示：

```{r,}
 1+2+3+4+11+12+13+14+21+22+23+24+31+32+33+34
```
&emsp;&emsp;由上可知，计算得到和为280。

&emsp;&emsp;方法二：使用R对编码赋值编写程序计算为例，操作如下所示：
```{r,}
a<-1:4
b<-11:14
c<-21:24
d<-31:34
y=sum(a)+sum(b)+sum(c)+sum(d)
y
```
&emsp;&emsp;直接运行赋值对象的编码，运行结果为280.
```{r,}
print(y)
```
&emsp;&emsp;通过print函数对赋值参数进行访问，运行结果为280。
```{r,}
(y=sum(a)+sum(b)+sum(c)+sum(d))
```
&emsp;&emsp;对表达式加括号进行运算优先，可直接运行括号内的结果为280。
```{r,}
sum(a,b,c,d)
```
&emsp;&emsp;对整体赋值的表达式直接进行求和，结果为280。当然，也可用分号，将短句进行连接，直接一行展示运行，如下所示：

```{r,}
a<-1:4;b<-11:14;c<-21:24;d<-31:34;sum(a,b,c,d)
```
&emsp;&emsp;通过“；”将短代码进行连接，减少代码布局的空间，得到结果为280。

##R的条件控制语句
&emsp;&emsp;1）if/else

&emsp;&emsp;如果假定一个条件是5，只要其中一个数的值在该范围内，就会显示一个结果，如下所示：
```{r,}
 X<-5
 if(X<6) "运行"
```
&emsp;&emsp;由上可知，当第一个条件X满足X<6时，5明显小于6，执行后就会显示出结果“运行”。
```{r,}
X<-4
if(X>4) print(3*4)  else   print(5*4)
```
&emsp;&emsp;由上可知，当X大于4时，执行3和4相乘；当X不大于4时，执行5和4相乘，得到结果5乘以4为20。

&emsp;&emsp;2）ifelse语句
```{r,}
X<-1
ifelse(X>2,2*X,3*X)
```
&emsp;&emsp;由上可知，当X大于2时，执行2和X相乘；否则，执行3与X相乘。而赋值X=1，明显小于2，选择1和3相乘，得到结果为3。

&emsp;&emsp;3）switch语句
```{r,}
switch(1,2*3,sd(1:5),runif(3))#返回(2*3,sd(1:5),runif(3))list中的第一个成分。
```

&emsp;&emsp;由以上显示，返回(2*3,sd(1:5),runif(3))list中的第一个成分为6。

##R的循环语句

&emsp;&emsp;1）for循环

&emsp;&emsp;例如，计算1+2+3+4+5+...+200的值：
```{r,}
s<-0#s初始值的和为0
for(i in 1:200){#循环变量i从1到200
s<-s+i #每次循环在和的基础上加i
}
print(s)# 当i从1取值到200后，循环终止，得出最后结果。
```
&emsp;&emsp;由上可知，当i从1取值到200后，循环终止，得出最后结果为20100。

&emsp;&emsp;2）while结构

&emsp;&emsp;例如，计算1+2+3+4+5+...+200的值：
```{r,}
s<-0#s初始值为0
i<-1#循环变量初始值为1
while(i<=200){#当i小于等于200时，进行循环
s<-s+i#在每次循环结果上加i
i<-i+1#循环变量值在不停的变化
}
print(s)#当循环变量值i为201时，得出计算结果
```
&emsp;&emsp;由上可知，当循环变量值i为201时，得出计算结果为20100。

&emsp;&emsp;3）repeat结构

&emsp;&emsp;例如，计算1+2+3+4+5+...+200的值：
```{r,}
s<-0#s初始值为0
i<-1#循环变量初始值为1
repeat{#进入循环
if(i<=200)#当i小于等于200时，进行求和
{
s<-s+i#在每次循环结果上加i
i<-i+1
} 
else break#循环变量值在不停的变化

} # 当大于200时，进行终止
print(s)#当循环变量值i为201时，得出计算结果
```
&emsp;&emsp;由上可知，当循环变量值i为201时，得出计算结果为20100。

#自定义函数
***
&emsp;&emsp;自定义函数创建需要用到function，函数规则为：

&emsp;&emsp;**sapply（X，FUN，options）**

&emsp;&emsp;其中，X:数据框或矩阵;FUN：为任意的函数；options：若被指定，则将被传递给FUN。操作如下所示：
```{r,}
library(readxl)   # 读取前加载包
data=read_excel("D:/TASK/4 净水器数据.xlsx")
X=data[,2:3]  # 样本数据
Des.Fun=function(X,...){
Av=mean(X,na.rm=TRUE)  # 均值
Sd=sd(X,na.rm=TRUE)  # 标准差
n=length(X)  # 样本数量
Sk=sum((X-Av)^3/Sd^3)/n  # 偏态
Ku=sum((X-Av)^4/Sd^4)/n-3  # 峰度系数
result=list(av=Av,sd=Sd,skew=Sk,kurt=Ku) # 均值、标准差、偏态和峰度系数作为列表数值
return(result)
}
DesRep=sapply(data[,2:3],FUN=Des.Fun,na.rm=T)
DesRep
```
&emsp;&emsp;由上可知，通过自定义函数计算，得出均值、标准差、偏态和峰度系数作为列表数值。

#R代码调试
***
&emsp;&emsp;R使用过程中，有时程序无法运行，R通常会给出报错信息，根据报错的信息找出错误的原因，也可以通过traceback（）、Debug()和Browser()函数找出程序出错的地方。为了进一步提高R的程序代码运行时间，可对代码语言程序进行调试。如下所示：

&emsp;&emsp;第一次调试，结果如下显示:
```{r,}
tst<-proc.time()  # 将proc.time()值保存在tst中
tx<-rnorm(10000)  # 产生10000个服从正态分布的随机数保存在对象tx
td<-rnorm(10000)  # 产生10000个服从正态分布的随机数保存在对象td
xd<-c()  
for (i in 1:10000){
  xd<-c(xd,tx[i]+td[i])
} # 计算i在1到10000时，tx和td的和
proc.time()-tst  # 运行程序调试结果
```
&emsp;&emsp;由上述知，user是用户，system 是指系统，elapsed是指程序运行时长。在运行基础上，继续进行第二次调试，如下所示：

```{r,}
tst<-proc.time()  # 将proc.time()值保存在tst中
xd<-rep(NA,10000) 
for (i in 1:10000){
  xd<-c(xd,tx[i]+td[i]) # 计算i在1到10000时，tx和td的和
}
proc.time()-tst  # 运行程序调试结果
```
&emsp;&emsp;由上可知，通过对比第一次和第二次的调试结果，发现程序运行时间在逐渐减少。进行第三次调试，结果如下显示：
```{r,}
tst<-proc.time()  # 将proc.time()值保存在tst中
xd<-tx+td # 计算tx和td的和
proc.time()-tst  # 运行程序调试结果
```
&emsp;&emsp;由上可知，通过第三次调试，明显可以看出，第三次的调试在性能上总体比前2次效果好，在一定条件下选择第三种效果较好。

#参考文献
&emsp;&emsp;[1]方匡南, 朱建平, 姜叶飞. R数据分析:方法与案例详解[M]. 电子工业出版社, 2015.

&emsp;&emsp;[2]洪锦魁, 蔡桂宏. R语言:迈向大数据之路[M]. 清华大学出版社, 2016.

&emsp;&emsp;[3]薛薇. 基于R的统计分析与数据挖掘[M]. 中国人民大学出版社, 2014.


