美文网首页
R--编程结构(二)

R--编程结构(二)

作者: KevinCool | 来源:发表于2016-03-21 09:28 被阅读58次

    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 <- 2
    z
    }
    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 <- 2
    z
    }```

    闭包包含函数的参数,函数体以及调用时的环境

    #闭包包含一个可以创建局部变量的函数
    #并且创建另外一个函数可以访问该变量
    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))```

    相关文章

      网友评论

          本文标题:R--编程结构(二)

          本文链接:https://www.haomeiwen.com/subject/qjsklttx.html