zoukankan      html  css  js  c++  java
  • R的环境系统

     

    r环境概念

    环境:用来具体存储对象的地方。
    
    规则1:每一个对象都存储在一个环境当中。
    
    规则2:每一个环境都与一个父环境相连接,构成一个分层的环境系统。
    
    规则3:子环境与父环境的连接是单向的。
    
    parenvs()查看当前R的环境; parenvs(all=TRUE)会返回当前会话包含的环境列表。
    
    as.environment():指向环境树中的任意一个环境。
    globalenv(); base(); emptyenv(); parent.env()
    assign():赋值函数
    #R的环境系统
    install.packages("pryr")
    library(pryr)
    #查看当前R的环境
    parenvs()
    #显示R的环境树
    parenvs(all = T)

    空环境的特点:

    #1.空环境没有父环境
    #2.空环境当中没有存储任何对象
    #当我们加载一个包的时候,这个包会在R里边
    #创建一个新的环境,并且这个新的环境会作为
    #全局环境的父环境
    library(ggplot2)
    parenvs(all = T)
    library(xlsx)
    parenvs(all = T)
    library(openxlsx)
    #指向一个环境
    as.environment("package:xlsx")
    #指向全局环境
    globalenv()
    #指向基环境
    baseenv()
    #指向空环境
    emptyenv()
    
    #查看一个环境的父环境
    parent.env(globalenv())
    
    #列出当前环境创建的所有对象
    ls()
    ls(baseenv())
    ls(emptyenv())
    
    #练习:列出ggplot2包里边的所有对象
    ls(as.environment("package:ggplot2"))
    ls(package:ggplot2)
    
    #包里面的同名函数被屏蔽掉
    #解决方式
    #第一种方式
    xlsx::write.xlsx()
    #第二种方式
    as.environment("package:xlsx")$write.xlsx()
    
    #跨环境赋值
    assign("nihao",3,envir = globalenv())
    nihao
    
    #活动环境
    #规则1:任何时候,R的活动环境都只有一个
    #规则2:所有的新对象都会被存储在该环境中
    #规则3:在搜索对象的时候,会优先从当前的环境里边搜索
    
    #查看当前的活动环境
    environment()
    ls()
    
    #查找一个对象保存在哪个环境中
    find("c")

    作用域规则

    #作用域规则
    #规则1:R首先在当前的活动环境中搜索对象
    #规则2:当R在某个环境中没有搜索到对象时,
    #R会进入到该环境的父环境继续搜索
    > c(4,6)
    [1] 4 6
    > c<-9
    > c
    [1] 9
    #活动环境
    #规则1:任何时候,R的活动环境都只有一个
    #规则2:所有的新对象都会被存储在该环境中
    #规则3:在搜索对象的时候,会优先从当前的环境里边搜索
    
    #查看当前的活动环境
    environment()
    ls()
    
    #查找一个对象保存在哪个环境中
    find("c")
    #作用域规则
    #规则1:R首先在当前的活动环境中搜索对象
    #规则2:当R在某个环境中没有搜索到对象时,
    #R会进入到该环境的父环境继续搜索
      
    c(4,6)  
    c<-9  
    c  
    
    #错误的函数定义
    c<-function(x,y){
      x+y
    }
    c(4,6)
    find("c")
    #调用base包里的c函数
    base::c(4,6)
    baseenv()$c(4,6)
    rm(c)
    c(4,6)
    
    library(xlsx)
    parenvs(all = T)
    #从环境树中移除一个包
    detach("package:xlsx")
    library(xlsx)
    
    #运行时环境
    #作用:避免与全局环境中的变量起冲突
    c1<-function(x,y){
      x+y
    }
    
    x<-5
    c2<-function(t){
      x<-10
      x+t
    }
    
    #原环境
    #创建函数的环境就是它的原环境
    #不管这个函数在哪里调用,
    #它的父环境永远都是它的原环境
    
    show_env<-function(){
      list(hj=environment(),
           fhj=parent.env(environment()),
           dx=ls(environment()))
    }
    show_env()
    
    #调用环境
    x<-1:8
    y<-x^3
    qplot(x,y)
    
    show_env<-function(){
      a<-3
      b<-4
      list(hj=environment(),
           fhj=parent.env(environment()),
           dx=ls(environment()))
    }
    show_env()
    
    #单链接
    #子环境可以搜索父环境里边的对象,
    #但是父环境不能搜索子环境里边的对象
    
    #参数
    #函数运行时,参数会作为一个新的对象,
    #保存在运行时环境中
    show_env<-function(ui){
      a<-3
      b<-4
      list(hj=environment(),
           fhj=parent.env(environment()),
           dx=ls(environment()))
    }
    show_env()
    
    

    环境系统总结:

    #1.任何时候,R的活动环境都只有一个
    #2.它会将所有的新对象存储在这个环境中,
    #并且在搜索对象时,以此环境作为初始搜寻点
    #3.R的活动环境通常为全局环境,但是当R在做
    #函数求值时,会临时将活动环境调整为运行时环境,
    #这种运作模式保证了安全性
    #4.定义函数的初始环境就是原环境,或者叫做父环境
    #5.调用函数的环境就是函数的调用环境

    构建发牌函数

    #构建发牌函数
    PKP<-pkp
    # R语言记号体系,不要第一行数据
    pkp[-1,]
    
    fapai<-function(){
      ca<-pkp[1,]
      assign("pkp",pkp[-1,],envir = globalenv())
      ca
    }
    fapai()
    
    
    #构建洗牌函数
    pkp<-PKP
    xipai<-function(){
      sjs<-sample(1:52,52)
      # 在全局变量中找到PKP[sjs,]赋值给pkp
      assign("pkp",PKP[sjs,],envir = globalenv())
    }
    xipai()
    fapai()
    
    x<-1:6
    # 随机函数
    x[sample(x,6)]
    
    
    #构建闭包
    setup<-function(pk){
      PK<-pk
      
      #构建发牌函数
      fp<-function(){
        ca<-pk[1,]
        assign("pk",pk[-1,],envir = parent.env(environment()))
        ca
      }
      
      #构建洗牌函数
      xp<-function(){
        sjs<-sample(1:52,52)
        assign("pk",PK[sjs,],envir = parent.env(environment()))
      }
      
      list(FP=fp,XP=xp)
    }
    
    pkp<-PKP
    pai<-setup(pk=pkp)
    pai
    发牌<-pai$FP
    洗牌<-pai$XP
    rm(pkp)
    洗牌()
    发牌()
    
    #项目三-lao hu ji
    #BBB BB B
    #BB B BB
    #B B B 
    #C 7 C
    #C C BB
    #C C C
    #C 7 7
    #DD C B
    #B 0 0
    #7 7 DD 160
    #BBB BB DD
    #C 0 DD
    #7 DD DD 320
    #DD DD DD 800
    #DD 7 0
  • 相关阅读:
    cstc2018 混合果汁
    CF1086E Beautiful Matrix
    AT2000 Leftmost Ball
    CF1208E Let Them Slide
    CF1208D Restore Permutation
    【置顶】博客公告
    [NOI2015]软件包管理器
    【noip2018】积木大赛
    几天连测总结
    【ZJOI2007】棋盘制作
  • 原文地址:https://www.cnblogs.com/foremostxl/p/12019079.html
Copyright © 2011-2022 走看看