R的环境系统

时间:2019-12-16
本文章向大家介绍R的环境系统,主要包括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

原文地址:https://www.cnblogs.com/foremostxl/p/12019079.html