一、基本操作与控制

1.1通过以下方式获取帮助

help(函数名)
help(mean)

r语言gl函数用法_赋值

??关键词
??mean

r语言gl函数用法_数据_02

apropos('关键词')
apropos('mean')
 [1] ".colMeans"     ".rowMeans"     "colMeans"      "kmeans"        "mean"         
 [6] "mean.Date"     "mean.default"  "mean.difftime" "mean.POSIXct"  "mean.POSIXlt" 
[11] "rowMeans"      "weighted.mean"
#搜索出该包对应的信息及其所包含的函数列表
library(help='包的名称')
library(help='stats')

r语言gl函数用法_数据_03

#搜索与关键词相关的文档索引
RSiteSearch('关键词')
RSiteSearch('integrate')

r语言gl函数用法_赋值_04

  •  工作空间的保存与加载

除了可以使用文件菜单中的保存菜单项实现,还可通过终端命令实现

save.image('mywork.Rdata') #保存工作空间映像
unlink('mywork.Rdata') #取消关联
load('mywork.Rdata') #载入工作空间映像

 1.2管理变量列表

#搜索变量列表,以此来明确工作空间中的变量列表

ls(all=TRUE); ls() #列出工作空间中的所有变量
 [1] ".Random.seed" "C_X"          "C_XY"         "C_Y"          "colx"        
 [6] "i"            "m"            "mat"          "n"            "rowx"        
 [11] "X"            "Y"           
 [1] "C_X"  "C_XY" "C_Y"  "colx" "i"    "m"    "mat"  "n"    "rowx" "X"    "Y"   
ls(pattern = 'a',all.names = TRUE) #列出含a的所有变量
[1] ".Random.seed" "mat"         
ls(pat='^a') #列出以‘a’开头的所有变量
character(0)
ls.str() #列出所有变量的详细的内部信息
C_X :  Named num [1:4] -0.0372 0.8725 0.9341 -0.0144
C_XY :  Named num [1:2] 0.0228 0.0248
C_Y :  Named num [1:4] -0.0232 0.9701 0.9849 0.0682
colx :  num [1:10] 0 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
i :  int 43
m :  int 10
mat :  num [1:43, 1:10] 0.5 0.54 0.579 0.618 0.655 ...
n :  int 43
rowx :  num [1:43] 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 ...
X :  num [1:100] -0.326 0.552 -0.675 0.214 0.311 ...
Y :  num [1:100] 0.286 -0.345 0.326 -1.697 -1.285 ...
ls.str(pat='a') #列出含‘a’的所有变量的详细的内部信息
mat :  num [1:43, 1:10] 0.5 0.54 0.579 0.618 0.655 ...
#为了避免重复定义,将变量列表保存在文件中

save(x,y,z,file = 'mywork.RData') #仅保存三个变量到文件中
save(list=ls(all=TRUE),file = 'mywork.Rdata') #功能同save.image
save(list=ls(pat='a',file='myworl.RData') #保存名称中含a的变量到文件

1.3执行外部程序

system('ipconfig')

Windows IP 配置


以太网适配器 以太网:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . : 

以太网适配器 以太网 2:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . : 

无线局域网适配器 本地连接* 1:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . : 

无线局域网适配器 本地连接* 2:

   媒体状态  . . . . . . . . . . . . : 媒体已断开连接
   连接特定的 DNS 后缀 . . . . . . . :

 shell.exec可以实现的功能比System更加丰富,例如下列代码可以打开外部程序word

#注意:R中索引用/不能用\,否则会出现错误
 shell.exec("C:/ProgramData/Microsoft/Windows/Start Menu/Programs/Word")

 计算程序代码的执行时间

#Sys.time()为无参函数,给出当前的系统时间,通过设置options(digits.secs=6)可以精确到毫秒/微秒
T1=Sys.time()
n=100
N=(1:n)*100
means=numeric(n)
for (i in 1:n) 
  means[i]=mean(rnorm(N[i]))
plot(1:n,means,type = 'l')
abline(h=0)
Sys.time()-T1


Time difference of 0.05984116 secs

r语言gl函数用法_数据_05

#proc.time()为无参函数,给出【用户/系统/流逝】的三个时间,以秒为单位

T2=proc.time()
n=100
N=(1:n)*100
means=numeric(n)
for (i in 1:n) 
  means[i]=mean(rnorm(N[i]))
plot(1:n,means,type = 'l')
abline(h=0)
proc.time()-T2

用户 系统 流逝 
0.06 0.00 0.06

r语言gl函数用法_数据类型_06

 

#system.time(R表达式),针对R表达式计算其执行【用户/系统/流逝】的三个时间

system.time({
n=100;
N=(1:n)*100;
means=numeric(n);
for (i in 1:n) 
  means[i]=mean(rnorm(N[i]))
plot(1:n,means,type='l');
abline(h=0)
})

用户 系统 流逝 
0.05 0.00 0.05

r语言gl函数用法_赋值_07

二、语法与数据类型

2.1赋值语句

#使用=赋值
Age11=10; 年龄_12 = 10
print(Age11)
print(年龄_12)

#使用<-  <<-赋值
Age21<-10; 年龄22<-20; Age22<<-10
print(Age21)
print(年龄22)
print(Age22)

#使用->赋值
30->Age31; 30->年龄_32
print(Age31)
print(年龄_32)

#使用assign函数赋值
assign('Age41',40)
print(Age41)

r语言gl函数用法_数据_08

2.2基本数据类型

#R语言提供对字符型/数值型/逻辑型/复数等类型的支持
#并且可以通过class和mode两个函数看出变量的类型和模式

#字符型
X='10'
print(X);print(class(X));print(mode(X))
#转换
print(as.numeric(X));print(as.logical(X))

#数值型
X=10
print(X);print(class(X));print(mode(X))
#转换
print(as.character(X));print(as.logical(X))

#逻辑型
X=TRUE
print(X);print(class(X));print(mode(X))
#转换
print(as.character(X));print(as.numeric(X))

#复数
X=complex(1,1)
print(X);print(class(X));print(mode(X))
#转换
print(as.character(X));print(as.numeric(X))
> X='10'
> print(X);print(class(X));print(mode(X))
[1] "10"
[1] "character"
[1] "character"
> print(as.numeric(X));print(as.logical(X))
[1] 10
[1] NA
> X=10
> print(X);print(class(X));print(mode(X))
[1] 10
[1] "numeric"
[1] "numeric"
> print(as.character(X));print(as.logical(X))
[1] "10"
[1] TRUE
> X=TRUE
> print(X);print(class(X));print(mode(X))
[1] TRUE
[1] "logical"
[1] "logical"
> print(as.character(X));print(as.numeric(X))
[1] "TRUE"
[1] 1
> X=complex(1,1)
> print(X);print(class(X));print(mode(X))
[1] 1+0i
[1] "complex"
[1] "complex"
> print(as.character(X));print(as.numeric(X))
[1] "1+0i"
[1] 1

 2.3复杂数据类型

向量的生成

#向量:是一种具有相同类型的数据的一个容器,下标总是从1开始
#1.直接赋值拼接生成。数据类型:所有
V1=c(1,2,3)
c(V1,10,V1)
#[1]  1  2  3 10  1  2  3
#2等差序列。数据类型:数值型
V1=1:5;V2=5:1;V1;V2
#[1] 1 2 3 4 5
#[1] 5 4 3 2 1
#3等间隔序列。数值类型:数值型
seq(from=1,to=4,by=0.5)
#[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0
#4重复函数。数据类型:所有
rep(c(1,2),each=2,times=3)
#[1] 1 1 2 2 1 1 2 2 1 1 2 2
#5串尾函数。数据类型:数值型。以1开始,以序列元素结尾的连续整数向量
sequence(3:4)
#[1] 1 2 3 1 2 3 4
#6字符连接,连接符由sep指定
paste('X',1:5,sep = '')
#[1] "X1" "X2" "X3" "X4" "X5"
paste(c('X','Y'),1:6,sep='')
#[1] "X1" "Y2" "X3" "Y4" "X5" "Y6"
paste(1:5,collapse = '.')
#[1] "1.2.3.4.5"
#7向量长度,整数
vec=10
length(vec)
#[1] 1
#8引用
vec[1];vec[1:4]
#[1] 10
#[1] 10 NA NA NA

多维数组的生成

#数组:带有多个下标的类型相同的元素的集合或容器,通过设置维数向量dim改变数组的结构
#各维的下标总是从1开始
#1由向量改变维数生成
M=c(1,2,3,4);dim(M)=c(2,2);M
#      [,1] [,2]
#[1,]    1    3
#[2,]    2    4
#2由array函数生成
array(0,dim=c(2,3))
#      [,1] [,2] [,3]
#[1,]    0    0    0
#[2,]    0    0    0
#3三维数组,通过dim变成三维数组
Arr=array(1:36,dim=c(2,3,6))
#4数组维数,数组总长度
dim(Arr)
length(Arr)
#[1] 2 3 6
#[1] 36
#5引用
Arr[1,1,1]
Arr[1,,];Arr[,1,];Arr[,,1]

矩阵的生成

#矩阵:以二维表行列式构造的数据类型
#1直接生成
matrix(0,nrow = 2,ncol = 3)#生成2行3列全部为0的矩阵
matrix(c(1,2,3,4,5,6),nrow = 3,ncol = 2,byrow=TRUE)#生成3行两列的矩阵

#2向量生成
vec=1:8
matrix(vec,nrow=2,ncol=4,byrow=TRUE)

#3矩阵合并
rbind(mat1,mat2)#以行方式合并,列需要相等
cbind(mat1,mat2)#以列方式合并,行需要相等
mat1=matrix(1:12,3,4)
mat2=matrix(-1:-12,3,4)
rbind(mat1,mat2);cbind(mat1,mat2)

#4矩阵维数,矩阵行列数
dim(mat1)
nrow(mat1); ncol(mat1)

#5引用
mat1[1,]; mat1[1:3,]#引用第1行向量,第1到3行子矩阵
mat1[,1]; mat1[,1:3]#引用第1列向量,第1到3列子矩阵

 rbind(mat1,mat2);cbind(mat1,mat2)

r语言gl函数用法_r语言gl函数用法_09

因子的生成

#离散变量由各种不同的表达方式,在R中通过因子统一表示
#解决有关于名义变量、有序变量的内部表示,常用于计数,分类等
#1 转化成因子
S=c('A','B','A','C','B','D','A','C')
SF=factor(S)#默认按照数据的不同取值得到因子的水平
print(SF)
#[1] A B A C B D A C
#Levels: A B C D

#2 gl()函数生成
gl(n,k,length=n*k,labels = 1:n,ordered = FALSE)
#n为水平数,k为重复次数,length为结果长度,labels是n维向量表示因子水平
#ordered逻辑变量,表示是否有序
gl(3,2)
#[1] 1 1 2 2 3 3
#Levels: 1 2 3
gl(3,1,9)#9个1/2/3交叉
#[1] 1 2 3 1 2 3 1 2 3
#Levels: 1 2 3
gl(2,1,20)#20个1/2交叉
#[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
#Levels: 1 2
gl(2, 2, 20)
#[1] 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2
#Levels: 1 2

# 3基于水平进行计数
table(SF)
#SF
#A B C D 
#3 2 2 1

# 4获取水平
levels(SF)
#[1] "A" "B" "C" "D"

 

Tall=rnorm(10,170,10);
#随机抽样sample(x, size, replace = FALSE, prob = NULL)
#size是 10即抽取个数,replace选择TRUE表示可以重复,即有放回抽样
#参数prob,也就是“probability”(概率)的缩写,即代表某元素被抽取的概率
Sex=sample(c('男','女'),10,prob=c(0.5,0.5),replace=TRUE)
tapply(Tall,Sex,mean);#求均值
tapply(Tall,Sex,sd)#求标准差


> tapply(Tall,Sex,mean);#求均值
      男       女 
166.7138 163.7173 
> tapply(Tall,Sex,sd)#求标准差
      男       女 
3.332216 8.001746

列表的生成

#列表:是一种对象集合,各对象由下标或者名字加以区分和引用
#对象可以是任意类型,任意长度
#1 list定义列表
A=list(x=c(1,2,3),y=c('A','B')); A

#$x
#[1] 1 2 3

#$y
#[1] "A" "B"
#2 修改列表
A$x=c(1,2,3,4) #修改x列表
A$x=NULL #删除x元素
A$z=c(11,22) #增加z元素

#$y
#[1] "A" "B"

#$z
#[1] 11 22

数据框的生成

#数据框:是一种特殊的列表对象
#每列为1个变量,由向量构成,类似数据库的表格,下标从1开始
# 1函数生成
df=data.frame(
  name=c("jack","rose","mary"),
  math=c(70,80,85),
  eng=c(90,97,96)
);
df
  "name math eng
1 jack   70  90
2 rose   80  97
3 mary   85  96"
"注意:df[[1]],df$name,df[["name"]],df[,1]四种方式等价,均返回第一列变量"

# 2列表转化,数组转化
as.data.frame(list) #list各元素长度必须相等
as.data.frame(array) #array必须是二维数组或者矩阵
 
# 3修改数据框
df$music=c(34,78,90) #增加一列变量
df$name=NULL #删除一列变量
#df=df[-c(1,2),];df=df[,-c(1,2)]#删除第1/2行,删除第1/2列
df$music=c(12,45,57) #修改第一列变量

colnames(df)=c("X1","X2","X3") #修改每列标题
rownames(df)=10:12 #修改每行标题

# 4可视化编辑
fix(df) #直接将修改的数据保存至df中
df=edit(df) #返回一个副本,没有保存至df中

# 5提取子数据
subset(df,select = -c(name,math))#提取除name和math以外的列
subset(df,math>=80 & eng>85)

# 6内联合并
df1=data.frame(x1=1:5,x2=2:6)
df2=data.frame(x2=3:6,x3=10:13)
merge(df1,df2,by='x2')
   x1 x2
1  1  2
2  2  3
3  3  4
4  4  5
5  5  6

 表格编辑窗口,由fix调用弹出

> df=data.frame(
+   name=c("jack","rose","mary"),
+   math=c(70,80,85),
+   eng=c(90,97,96)
+ );
> fix(df)

r语言gl函数用法_r语言gl函数用法_10

三、输入与输出

3.1读取剪贴板数据

x=read.table("clipboard",header=TRUE)

3.2读取文本文件数据

#1列表形式读取数据成对读取,从键盘上读取数据不加任何参数直接掉用scan函数即可
scan(text='1 2 3 4 3 4 5 6 4 5 6 7',what=list(id=0,value=0))
frtab=scan(what = list(name="",score=0))
A=read.table('test.data',header=TRUE)

3.3读取数据库数据-基于windows的RODBC包

四、流程控制

x=1:10;y=seq(1,5.5,0.5);x+y
# 1ifelse(condition,expression1,expression2)
x=sample(1:100,1)
ifelse(x>=60,'及格','不及格')

# 2 switch(expression,list)
#expr为表达式,其值或为一个整数值或为一个字符串
#list为一个列表,是罗列出来的多个数据,各个数据的类型不限
x=sample(1:5,1);
switch (x,10,TRUE,'及格',FALSE,'不及格')

# 3 循环结构
#for(name in expr1) expr2
sum=0
for(i in 1:100) sum=sum+i;
sum
#5050

#while(condition) expr
sum=0;i=1;
while (i!=100) {sum=sum+i;i=i+1;}
sum
#4950

#repeat expr
sum=0;i=1;
repeat{
sum=sum+i;i=i+1;
if(i>100) break;
}
#5050

#求1-100不能被5整除的数
sum=0
for (i in 1:100) {
  if(i%%5==0) next
  sum=sum+i
}
#4000
sum(1:100)-sum(seq(5,100,5))
#4000
A=1:100
sum(A[A%%5!=0])
#4000

#括号的作用,命令格式(var=value),表明对var赋值为value的同时,输出var的结果
#等价于var=value;var
plot((x=1:100),sqrt(x))

r语言gl函数用法_r语言gl函数用法_11

五、函数与数据集

strsplit('ab cd efg',NULL)
#[[1]]
#[1] "a" "b" " " "c" "d" " " "e" "f" "g"
strsplit("a.b.c","\\.")
strsplit("a.b.c",".",fixed = TRUE)#与上一句代码结果相同
#[[1]]
#[1] "a" "b" "c"
strsplit(c(x1="asfefg",x2="qwerty"),"e")
#$x1
#[1] "asf" "fg" 

#$x2
#[1] "qw"  "rty"

#模式匹配
grep('[a-b]x[a-e]',c('axc','bxd','zy','oem'))
#[1] 1 2
text = c("We are the world", "we are the children")
grep("We", text)  #向量text中的哪些元素匹配了单词'We'
#[1] 1
grep("We", text, invert = T)  #向量text中的哪些元素没有匹配单词'We'
#[1] 2
grep("we", text, ignore.case = T)  #匹配时忽略大小写
#[1] 1 2

#sub搜索并替换
sub('[a-b]x[a-e]','zz',c('axc','bxd','zy','oem'))
#[1] "zz"  "zz"  "zy"  "oem"

#批量运算函数 apply() apply函数经常用来计算矩阵中行或列的均值、和值的函数
Data=data.frame(hei=rnorm(30,170,9),wei=rnorm(30,55,16))
apply(Data,2,mean) #计算各列均值
#hei       wei 
#170.45638  56.90765 
apply(Data,2,mean,trim=0.1) #计算各列截尾均值
#hei       wei 
#170.19419  57.37628 
mymedian=function(x) return(median(x))
apply(Data,2,mymedian) #传递自行编写的函数
#hei       wei 
#168.95539  54.10133 

stu=c('LV Shulong','LTU Wenli','LIANG Feibao','XIONG xianzhu')
names=strsplit(stu,' ')
First=sapply(names,'[',1)
Last=sapply(names,'[',2)
names;First;Last
sapply(Last,nchar)
#> First
#[1] "LV"    "LTU"   "LIANG" "XIONG"
#> Last
#[1] "Shulong" "Wenli"   "Feibao"  "xianzhu"
#> sapply(Last,nchar)
#Shulong   Wenli  Feibao xianzhu 
#     7       5       6       7 

#其他常用函数
#any()和all()函数比较两个对象是否相等
X=1:10; Y=c(1:5,10:14); Z=c(X,Y)
any(X!=Y);any(X==Y) #部分相等都返回TRUE
all(X!=Y);all(X==Y) #不完全相等都返回FALSE
identical(X,Y) #不完全相等返回FALSE
unique(Z) #剔除了重复值返回
#[1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14
Z[duplicated(Z)] #返回重复值1 2 3 4 5 10
which(X!=Y) #返回不相等元素所在下标 6  7  8  9 10
"^"(8,1/3) #返回8的立方根 2

#表达式运算
#字符串转换成表达式求值,用到parse()和eval()两个函数
A=1:15;eval(parse(text='sum(A)'))
#字符串’sum(A)‘通过parse变成expression,再由eval求值
#120

#内置函数 is.primitive()测试一个函数是否为内置函数
is.primitive(mean)
#[1] FALSE

#methods函数,可以通过Methods获取函数列表
#再直接输入函数名称,则可以看到函数的内部实现代码
methods(mean)
mean.default
# > methods(mean)
# [1] mean.Date     mean.default  mean.difftime mean.POSIXct  mean.POSIXlt 
# see '?methods' for accessing help and source code
# > mean.default
# function (x, trim = 0, na.rm = FALSE, ...) 
# {
#   if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
#     warning("argument is not numeric or logical: returning NA")
#     return(NA_real_)
#   }
#   if (na.rm) 
#     x <- x[!is.na(x)]
#   if (!is.numeric(trim) || length(trim) != 1L) 
#     stop("'trim' must be numeric of length one")
#   n <- length(x)
#   if (trim > 0 && n) {
#     if (is.complex(x)) 
#       stop("trimmed means are not defined for complex data")
#     if (anyNA(x)) 
#       return(NA_real_)
#     if (trim >= 0.5) 
#       return(stats::median(x, na.rm = FALSE))
#     lo <- floor(n * trim) + 1
#     hi <- n + 1 - lo
#     x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi]
#   }
#   .Internal(mean(x))
# }
# <bytecode: 0x0000011a9f3ec040>
#   <environment: namespace:base>

#排序函数sort和order
#区别:sort函数只能对单个向量进行简单的升降序
#order函数可以对多个变量数据进行排序
x=matrix(1:25,5,5)#创建一个5行5列的矩阵,对其进行排序,使用order()函数
# > matrix(1:25,5,5)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    6   11   16   21
# [2,]    2    7   12   17   22
# [3,]    3    8   13   18   23
# [4,]    4    9   14   19   24
# [5,]    5   10   15   20   25
x[order(x[,1],decreasing = T),]
# > x[order(x[,1],decreasing = T),]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    5   10   15   20   25
# [2,]    4    9   14   19   24
# [3,]    3    8   13   18   23
# [4,]    2    7   12   17   22
# [5,]    1    6   11   16   21

#分组统计函数aggregate函数
aggregate(iris[,1:4],by=list(Species=iris$Species),mean)
#     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1     setosa        5.006       3.428        1.462       0.246
# 2 versicolor        5.936       2.770        4.260       1.326
# 3  virginica        6.588       2.974        5.552       2.026

Fun=function(x) colMeans(x)
by(iris[,1:4],iris$Species,Fun)
# iris$Species: setosa
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
# 5.006        3.428        1.462        0.246 
# --------------------------------------------------------------- 
#   iris$Species: versicolor
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
# 5.936        2.770        4.260        1.326 
# --------------------------------------------------------------- 
#   iris$Species: virginica
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
# 6.588        2.974        5.552        2.026 

#数据的引用attach(),detach(),with(),within()
Species=1:10
attach(iris);Species;detach(iris)
#[1]  1  2  3  4  5  6  7  8  9 10
with(iris,levels(Species))
with(iris,{plot(Sepal.Length);levels(Species)})
# > with(iris,levels(Species))
# [1] "setosa"     "versicolor" "virginica" 
# > with(iris,{plot(Sepal.Length);levels(Species)})
# [1] "setosa"     "versicolor" "virginica"

#数据集,通过data()函数可以得到R系统提供的内置数据集
Nile#引用数据Nile
# Time Series:
#   Start = 1871 
# End = 1970 
# Frequency = 1 
# [1] 1120 1160  963 1210 1160 1160  813 1230 1370 1140  995  935 1110  994 1020
# [16]  960 1180  799  958 1140 1100 1210 1150 1250 1260 1220 1030 1100  774  840
# [31]  874  694  940  833  701  916  692 1020 1050  969  831  726  456  824  702
# [46] 1120 1100  832  764  821  768  845  864  862  698  845  744  796 1040  759
# [61]  781  865  845  944  984  897  822 1010  771  676  649  846  812  742  801
# [76] 1040  860  874  848  890  744  749  838 1050  918  986  797  923  975  815
# [91] 1020  906  901 1170  912  746  919  718  714  740

六、自定义函数

#1定义二元运算 "%any%"=function(x,y){statements;return(object)}
#统计一个因子向量中每个元素在另一个因子向量中分别出现的次数
"%@%"=function(x,y){
  z=factor(y,levels=x)
  z=table(z)
  list(x=x,sum=z)
}

#函数的调用
X=c(1,2,3)
Y=c(1,2,2,1,3,2,1,2,5,3,3,2)
X%@%Y
# $x
# [1] 1 2 3
# 
# $sum
# z
# 1 2 3 
# 3 5 3

#2 一般形式funname=function(arg1,arg2,arg3,.....){statements;return(object)}
#定义一个函数,对输入的矩阵数据,返回指定列的平均数和中位数
stat_mat_cola=function(mat,col){
  m1=mean(mat[,col])
  m2=median(mat[,col])
  return(c(mean=m1,median=m2))
}
stat_mat_cola=function(mat,col)
c(mean=mean(mat[,col],median=median(mat[,col])))

#3 缺省值和命名参数
#求偏导函数及导数值
fxy = expression(sin(x)*y+cos(y)*x)
dxy = deriv(fxy, c("x", "y"), func = TRUE)
# dxy(1,3)
# [1] 1.53442
# attr(,"gradient")
#             x        y
# [1,] 0.6309144 0.700351

#4 省略号参数
#参数中含有省略号表示无限的参数
atest=function(x,...){
  print(x)
  list(...)
}
atest(10,y=1,z=2)
# [1] 10
# $y
# [1] 1
# 
# $z
# [1] 2

#5嵌套函数
#从1-10中随机有放回抽取30个构成10行3列矩阵,然后计算任意两行对应位置出现相同数字的个数
myfun=function(x,dat){
  subfun=function(x,y) return(sum(x==y))
  apply(dat, 1, subfun, x)
}
mat=matrix(sample(1:10,30,replace=TRUE),nrow = 10,byrow=TRUE)
apply(mat,1,myfun,mat)
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    3    0    0    0    0    0    1    0    1     0
# [2,]    0    3    1    0    0    0    0    0    1     0
# [3,]    0    1    3    0    0    0    0    0    2     1
# [4,]    0    0    0    3    0    1    0    0    0     0
# [5,]    0    0    0    0    3    0    0    1    0     1
# [6,]    0    0    0    1    0    3    0    0    0     0
# [7,]    1    0    0    0    0    0    3    0    1     0
# [8,]    0    0    0    0    1    0    0    3    0     1
# [9,]    1    1    2    0    0    0    1    0    3     1
# [10,]    0    0    1    0    1    0    0    1    1     3

#6递归函数
fun=function(n,a){
  ifelse(n==1,a/2,(fun(n-1,a)+a/fun(n-1,a))/2)
}
sapply(1:5,fun,a=3)
#[1] 1.500000 1.750000 1.732143 1.732051 1.732051