《R语言入门与实践》学习笔记四
第四天任务:
完成项目玩扑克牌后1/2,并通过项目学会以下技能:
1)从一个数据集中抽取个别数据值。
2)在一个数据集中改变个别数据的取值。
3)编写逻辑测试程序。
4)使用R的缺失值符号NA。
………………………………………………………………
可以将该项目后1/2分成三个子任务:
1.编写用来发牌和洗牌的函数。
2.改变点数系统以适应不同的扑克游戏。
3.管理扑克牌桌的状态。
………………………………………………………………
玩扑克牌应该做扑克牌该做的事,比如洗牌和发牌(从扑克牌堆最上方拿牌)。而对数据进行值的选取,通常值是通过R的记号体系提取:deck[ , ](deck为要操作的数据框,逗号两边为索引参数,左行右列)。R的索引与线性代数的索引一样,都是从1开始的,对R来说有六种索引方式,分别是:
1)正整数索引:deck[i ,j ]或deck[i ,c(1:3)]
R会将值存储为原值的一份副本,可以将副本赋值给对象。如果从数据框中提取两列或两列以上的数据,R会返回新的数据框,只提取一列,R会返回一个向量,如果想让向量变成数据框,需要添加参数drop=FALSE:deck[1:2,1,drop=FALSE]
2)负整数索引
与正整数索引正好相反,R会返回负整数索引对应的元素。
3)零索引
如果使用零索引,R不会提取任何信息返回一个空对象。
4)空格索引
使用空格索引提取数据框所有行或者所有列。
5)名称索引
如果被索引的对象有名称属性,就可以使用名称索引。
deck[1,c(“face”,”suit”,”value”)]
##face suit value
##king spades 13
要想提取数据框的某一列,使用$分隔符分开数据框的名称和要提取的列的名称,并将所有值作为向量返回,因此可以立即将返回结果作为输入交给函数,其操作类似与在列表中使用双中括号返回元素值而不是它的列表结构。
-------------------------对象改值--------------------------
就地改值
R的记号体系可以在R的对象内部改值,即可以将新值覆盖旧值,也可增加新值,这使得可以为数据集添加新变量:
deck$new<-1:52
deck[1, ]
##face suit value new
##kingspades 13 1
在War游戏中,A(ace)的点数是最高的,想要玩War,就要把A的点数从1加到14。如果还没有洗牌,可以知道每13张牌重复一次,因此可以:
deck$value[c(13,26,39,52)]<-14
这些替换操作都是发生在数据集内部,不会产生deck的副本。
逻辑测试
在R中,有七种逻辑运算符,分别是< ,<= ,> ,>= ,== ,!= ,%in%,其中%in%的用法是a%in%c(a,b,c),代表c(a,b,c)中是否含有a,而且它是唯一一个不一一对比的运算符。所以上面的运算可以改为:
deck$value[deck$face==”ace”]<-14
在Hearts游戏中,除了花色为红桃和黑桃Q的牌,其他点数都是0。
deck$value<-0
deck$value[deck$suit==”hearts”]<-1
deck$value[deck$suit==”spades”&deck$face==”queen”]<-13
在R语言中,布尔运算符有6种,& ,| ,xor(异或) ,! ,any ,all学会使用布尔类型会对数据处理有很大的帮助。
缺失信息
R中的特殊字符NA代表不可用,可用于存储缺失信息。缺失信息不等于0,它代表的是不确定属性,可以将NA看作是可能等于也可能不等于一个数的值。比如1+NA=NA,NA==1##NA。大多数R函数都有一个可选参数na.rm,当na.rm=TRUE时R会在对函数求值时忽略NA。
比如mean(c(NA,1:50),na.rm=TRUE)##25.5
is.na函数用来确定某个值是否是一个缺失值:
vec<-c(1,2,3,NA)
is.na(vec)
##TRUE FALSEFALSE FALSE
这样我们玩Blackjack到时候就可以将ace设置为NA了。
-----------------------------函数设计-------------------------------
两个函数都要求对deck数据框进行直接操作,且发牌函数(deal)要将牌堆上的第一张牌不放回的拿出来,洗牌则是对deck数据集直接打乱顺序。
要想设计好两个函数。就要对R中如何存储,查找和操作对象有所了解。R存储对象时采用了和树形文件管理系统类似的层级系统结构,每一个对象都存储在一个环境当中,每一个环境都与一个父环境相连,一层一层就构成了分层的环境系统。
可以通过devtools包中的parenvs函数查看R中的环境系统。
parenvs(all=TRUE)
R的环境存储在RAM内存中,拥有惟一一个没有父环境的顶级环境,且不支持自上而下的搜索。R在每一次运性函数的时候都会创建一个新的活动环境,函数是在新环境中运行的。类似与C++中每个函数都有自己的函数空间,在函数内新建的普通变量不能在函数外使用。每次运行一个新的函数R就会创建一个新的环境,最后将求的值返还给就环境中。R就是通过这种方法来确保不会覆已经存在的对象。所以R函数只会调用自己定义的函数。
发牌函数:
deal<-function(){
card<-deck[1, ]
assign(“deck”,deck[-1, ],envir=globalenv())
card
}
洗牌函数:
洗牌可以通过随机抽取函数sample来模拟,随机抽取deck中的值,然后将其重新赋值给新的对象即可:
shuffle<-function(){
random<-sample(1:52,size=52)
assign(“deck”,DECK[random, ],envir=globalenv())
}##该函数在全局变量里输出一个洗好的数据框。
闭包
发牌和洗牌可以统一写入函数setup:
新版本与旧版本相比有一个重要的差别,新版本的原环境不再是全局环境,而是R在运行setup函数时所创建的运行环境,这个环境也是R创建DEAL和SHUFFLE的地方。这样处理的方式叫做闭包,setup的运行环境将deal函数和shuffle函数包了起来,两个函数可以直接调用包围式环境的对象,但是其他外部的函数几乎不能做到这一点。这样做使得即使在活跃的全局函数中deck被修改或者删除,也不会影响函数的运行。
这个版本的setup函数不会更新全局环境中的deck对象,只与其所处环境的父环境中的对象合作。
-----------------------------注-------------------------------
1.本学习记录来自Garrett Grolemund先生所著《Hands-On Programming with R》(中文名R语言入门与实践)一书。
2. 21点(Blackjack)由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。
《R语言入门与实践》学习笔记四相关推荐
- Java多线程编程实战指南
内容简介 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然而,多线程编 ...
- Java多线程编程实战指南+设计模式篇pdf
下载地址:网盘下载 随着CPU 多核时代的到来,多线程编程在充分利用计算资源.提高软件服务质量方面扮演了越来越重要的角色.而 解决多线程编程中频繁出现的普遍问题可以借鉴设计模式所提供的现成解决方案.然 ...
- java多线程实战指南_学习笔记《Java多线程编程实战指南》二
2.1线程属性 属性 属性类型及用途 只读属性 注意事项 编号(id) long型,标识不同线程 是 不适合用作唯一标识 名称(name) String型,区分不同线程 否 设置名称有助于代码调试和问 ...
- 《java多线程编程实战指南 核心篇》读书笔记二
1. 竞态 对于同样的输入,程序的输出有时候正确而有时候却是错误的.这种一个计算结果的正确性与时间有关的现象就被称为竞态(RaceCondition) 导致竞态的常见原因是多个线程在没有采取任何措施的 ...
- 《java多线程编程实战指南 核心篇》读书笔记一
1. run方法是线程的任务处理逻辑的入口方法,它由java虚拟机在运行相应线程时直接调用,而不是由应用代码进行调用. 2. 启动一个线程的实质是请求java虚拟机运行相应的线程,而这个线程具体何时能 ...
- 学习笔记《Java多线程编程实战指南》四
JAVA线程同步机制 线程同步机制:是一套用于协调线程间的数据访问及活动的机制,该机制用于保障线程安全以及实现这些线程的共同目标.java平台提供的线程同步机制包括锁.volatile关键字.fina ...
- java多线程编程_《java多线程编程实战指南》读书笔记 -- 基本概念
展开 并发:多个线程操作相同资源,保证线程安全,合理使用资源 高并发:服务能同时处理多个请求,提高程序性能 测试上下文切换工具 Lmbench3 测量上下文切换时长 vmstat 测量上下文切换次数 ...
- 《java多线程编程实战指南 核心篇》读书笔记三
1. 锁的思路: 将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问.锁(lock)就是利用这种思路以保障线程安全的线程同步机 ...
- 你花了多久弄明白架构设计?java多线程编程实战指南pdf
一面 自我介绍 项目中的监控:那个监控指标常见的有哪些? 微服务涉及到的技术以及需要注意的问题有哪些? 注册中心你了解了哪些? consul 的可靠性你了解吗? consul 的机制你有没有具体深入过 ...
- java多线程编程实战指南_java多线程编程实战指南 怎么样
展开全部 Active Object模式简介 Active Object模式是一种异步编程模32313133353236313431303231363533e59b9ee7ad943133336130 ...
最新文章
- ios手机连接远程服务器,04-iOS逆向工程使用SSH通过USB远程登录越狱iPhone
- Windows 上搭建FTP服务器
- graylog2+syslog-ng+mongodb构建集中管理日志服务器 --转载
- 阿里研究院潘永花:大数据将成为新的煤和石油
- Python快速简单生成矩形词云
- SpringBoot | 自动配置原理
- JS template string 神奇术
- 安全SaaS调查品牌认知
- 百家cms v4.1.4漏洞
- 带你画uml系统用例图
- 微信聊天记录云存储服务如何收费
- IPC(进程间通信) | 信号量机制
- oracle中间人投毒漏洞,‘TNS Listener’远程数据投毒漏洞
- 有没有开以修改服务器游戏数据,剑网3指尖江湖第二批服务器数据互通啦 来看看有没有你所在的大区...
- 洛谷P1488 肥猫的游戏
- 性能测试线上培训班怎么选 3点教你在线选好培训班
- jspdf插件实现jsp页面导出为pdf文件
- HuskyLens人工智能摄像头
- 【Lua从青铜到王者基础篇】第十二篇:Lua错误处理
- 25万的特斯拉会动了谁的奶酪?
热门文章
- Java开发面试(持续更新)
- 转一篇有关竞争对手LANDESK CEO的故事
- 周期函数的傅里叶级数展开
- php后台界面修改教程,帝国cms后台界面修改方法
- 华硕X550LD笔记本安装黑苹果
- 小程序报错 TypeError: Cannot read property getPreloadAdUnitIds ?
- java-net-php-python-jspm药品一体化管理系统演示录像2019计算机毕业设计程序
- 基于支持向量机的谐波分析研究与实现
- Linux上一款强大的GIF录制软件,Peek
- MySQL之mysqlcheck、check、optimize和analyze