R语言中没有指针
x <- c(13,5,12)
sort(x)
#但是x的值没有变化
#如果函数输出包含多个变量
#返回列表
oddsevens <- function(v){
odds <- which(v%%2==1)
evens <- which(v%%2==0)
list(o=odds,e=evens)
}```
#对上级层次或者全局变量进行写
使用<<-或者assign()
two <- function(u){
调用函数后,这里就会创建一个全局变量u
u <<- 2u
z <- 2z
}
x<-2
two(x)
使用这个运算符对变量进行写会导致对上级环境层次的查找,
直到遇到该变量的第一个层次
f <- function(){
inc <- function(){x <<- x+1}
x <- 3
inc()
return(x)
}
f()
inc()将对f()中的x进行读写,上级环境层次
two <- function(u){
表示指定对顶层全局变量进行写操作
pos参数的值-1,positive integer,sys.frame
assign("u",2u,pos = .GlobalEnv)
z <- 2z
}```
闭包包含函数的参数,函数体以及调用时的环境
#闭包包含一个可以创建局部变量的函数
#并且创建另外一个函数可以访问该变量
counter <- function(){
ctr <- 0
#ctr的环境层次只比f高一个层次,所以是f
#所在层次的一部分,然后会打包返回给counter()的调用方
f <- function(){
ctr <<- ctr + 1
cat("this count currently has value",ctr,"\n")
}
return(f)
}
#c1和c2都包含对f()的一个拷贝
c1 <- counter()
c2 <- counter()```
#置换函数
x <- c(1,2,4)
function to get or set the names of an object
names(x) <- c("a","b","c")
将数赋值给函数调用的结果
x <- "names<-"(x,value=c("a","b","c"))
还有一个类似的是"["(x,value)
调用的是names<-()函数,由于有特殊符号
所以为"names<-"()
左边不是变量名的赋值语句都可以看成置换函数
x[3] <- 8 #equals to "[<-"()
"[<-"()用于写入变量,而"["()用于读
x <- c(8,88,5,12,13)
"["(x,3)
用value值替换2,3个元素
x <- "[<-"(x,2:3,value=99:100)
x[2:3] <- 99:100```
可记录元素修改次数的向量类
#construct a new object of class bookvec
newbookvec <- function(x){
tmp <- list()
#the vector to count
tmp$vec <- x
#the counts of the writes,刚开始的时候count初始化为0
tmp$wrts <- rep(0,length(x))
#用class函数给这个列表赋予类的属性
class(tmp) <- "bookvec"
return(tmp)
}
#function to read
#类似于列表的读取操作,读取特定类"["(x,pos)
"[.bookvec" <- function(bv,subs){
return(bv$vec[subs])
}
#function to write
#写入特定类(列表)"[<-"(x,pos,value)
"[<-.bookvec" <- function(bv,subs,value){
bv$wrts[subs] <- bv$wrts[subs]+1
bv$vec[subs] <- value
#返回整个对象
return(bv)
}```
#使用source()读取代码文件
source("xyz.R")
要使用edit()修改f1()函数
f1 <- edit(f1)
创建新函数
f2 <- edit(f1)
修改默认编辑器
options(editor = "/usr/bin/vim")```
二元运算符
#%开始和结束的函数,两个参数都是某种数据类型
#返回同样类型的值
"%a2b%" <- function(a,b) return(a+2*b)
3 %a2b% 5```
#匿名函数
f <- function(x) x/c(2,8)
z <- matrix(c(1,2,3,4,5,6),nrow = 3)
按行进行应用f到z
y <- apply(z,1,f)
或者是使用匿名函数
y <- apply(z,1,function(x) x/c(2,5))```
网友评论