R语言构造扑克牌自动发牌,洗牌

2023-10-27

在R语言构建自动洗牌,发牌
要求:自动洗牌、发牌
任务一:创建一副牌。学会如何使用R的数据类型和数据结构。
任务二:编写发牌和洗牌的函数。学习从一个数据集中抽取想要的数值。
首先需要创建一副牌(不包括大小王),从R语言的数据对象来看,数据框最合适。
因为花色是字符串,而点数是数字,所以能够承担数据类型不同的二维数据对象——数据框最合适。下面是创建pkp数据对象的代码

pkp<-data.frame(face=rep(c(2:10,"J","Q","K","A"),4),hs=rep(c("黑桃","方块","红桃","梅花"),each=13))

然后我们需要构造发牌,洗牌函数
在构造发牌,洗牌函数的过程中,最重要的理解逻辑,怎么才能发牌呢?
不妨思考模拟下日常生活中是怎么发牌的呢?首先我们都是从牌堆里面抽取一张扑克牌,然后牌堆就少了一张牌,继续按照顺序抽取,直到牌堆没有牌。
如果用代码思考的话,就是在pkp这个牌堆里面抽取第一张,然后有pkp[-1,]丢掉这张牌,继续抽取后丢掉,这就是发牌的过程。

#licensing pkp
licensing<-function(){
  assign("copypkp",copypkp[-1,],envir = globalenv())
  copypkp[1,]
}

在这里需要介绍下assign函数,assign函数是一个赋值语句,与”=”和”<-“不同的是,assign能在不同的环境下赋值。
下面需要介绍环境,环境在R中是比较重要的概念,什么是环境呢?
可以说环境和我们电脑里面的文件夹很类似
环境:用来具体存储对象的地方。
规则1:每一个对象都存储在一个环境当中。
规则2:每一个环境都与一个父环境相连接。构成一个分层的环境系统。
规则3:子环境与父环境的连接是单向的。
parenvs{pryr}:查看R的环境系统,parenvs(all=TRUE)会返回当前会话包含的环境列表。
as.environment():指向环境树中的任意一个环境。
globalenv();base();emptyenv();parent.env()
assign():赋值函数
下面通过parenvs查看当前R语言下的环境
这里写图片描述
默认环境是globalenv(全局变量),也就是说我们创建对象,一般都是在globalenv环境里,
如果创建函数的话,R会自动给函数分配环境,且函数环境是globalenv的子环境
说环境的话可能不好理解,我们把环境比作文件夹。globalenv环境相当于默认文件夹,我们在globalenv环境创建的对象都储存在默认文件夹里面,函数相当于在默认文件夹里面再创建一个文件夹,函数文件夹创建的对象储存在函数文件夹中。
这里写图片描述
关于环境有一点很重要。就是如何应用环境里面的对象。下面是环境作用域规则
活动环境:当前R执行活动的地方。
规则1:任何时候,R的活动环境都只有一个。
规则2:所有的新对象都会被存储在该环境中。
environment():查看当前的活动环境。
作用域规则:R搜索对象时会遵循的一系列规则。
规则1:R首先在当前的活动环境中搜索对象。
规则2:在命令行工作中,活动环境就是全局环境。
规则3:当R在某个环境中没有搜索到对象时,R会进入到该环境的父环境。
下面是洗牌函数的构造
我理解的洗牌就是要把pkp这个数据对象里面的顺序打乱,如何打乱顺序呢?
我的思路是,构造一个随机向量,里面有52个值,然后构造一个循环52次的结构,将随机向量一个个的赋值给pkp这个数据对象.下面是洗牌函数代码

#shuffle pkp
shuffle<-function(){
  copypkp<-pkp
  random<-sample(c(1:52),size=52)
  for (i in 1:52)
  {
    assign("copypkp",copypkp[random,],envir = globalenv())
  }
  print("your pkp has been shuffled")
}

完整代码如下

#create pkp data
pkp<-data.frame(face=rep(c(2:10,"J","Q","K","A"),4),hs=rep(c("黑桃","方块","红桃","梅花"),each=13))
#copy pkp
copypkp<-pkp
#licensing pkp
licensing<-function(){
  assign("copypkp",copypkp[-1,],envir = globalenv())
  copypkp[1,]
}
#shuffle pkp
shuffle<-function(){
  copypkp<-pkp
  random<-sample(c(1:52),size=52)
  for (i in 1:52)
  {
    assign("copypkp",copypkp[random,],envir = globalenv())
  }
  print("your pkp has been shuffled")
}

有一个点需要特别注意,就是对象的更改。两个函数我都是对copypkp这个数据对象进行更改,pkp这个数据对象是没有变化的。这样有利于shuffle(洗牌)后的重置化。
但是这个自动洗牌,发牌还有一个重大的缺陷:如果pkp这个数据对象不小心被删除的化,整个洗牌,发牌过程都实现不了。
要解决这个问题,我们就必须用到闭包函数的概念和深入理解环境
在下一篇我会详细介绍闭包的实现和环境的深入理解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R语言构造扑克牌自动发牌,洗牌 的相关文章

  • 有没有办法在 RStudio 中调试 RScript 调用?

    假设我从命令行运行 R 脚本 如下所示 Rscript prog R x y z 我想检查某一行的代码 目前 我无法在 RStudio 中以交互方式调试它 因为我不知道如何传递参数 由于它设计为从命令行运行 因此如何通过命令行 RStudi
  • R - 正则表达式错误(PCRE 版本)

    我正在尝试使用koRpus在 R 中在运行 RHEL6 的 Linux 服务器上进行词形还原 上周 当我安装了 MRO Microsoft R Open 3 2 3 时 下面的代码效果很好 library koRpus lw c danci
  • 如果“testthat”测试在“R”中失败,则打印自定义诊断信息

    I use a testthat单元测试来检查是否data frame函数返回的结果与我期望它返回的结果相同 如果测试失败 testthat打印一些诊断信息 例如 MyFunction df orig is not identical to
  • R从列表中提取数据框,列名中没有前缀

    我在列表中放置了一个数据框 然后 当尝试将其提取回来时 我得到了该数据帧的所有以列表键为前缀的列名称 有没有办法完全按照最初传递的方式提取数据帧 cols lt c column1 Column2 Column3 df1 lt data f
  • 将summary()写入as.data.frame以在ggplot / R中使用

    请查找 af 数据样本t below 我正在使用以下方法进行竞争风险分析etmCIF来自etm package 产生以下结果 这很好 但需要更好的图形 曾经有一个ggtrans etm函数将数据导入ggplot 然而 这个功能显然被删除了
  • R 中的 NA 替换函数

    我正在尝试替换矩阵中的 NA mat 零 我在用着mat is na mat lt 0 当我有 18946 个变量的 94531 个观察值或更小的矩阵时 效果很好 但我在 22752 个变量的 112039 个观察值的矩阵上尝试它 R 显示
  • 查找数据帧列表中同一列中的所有重复值并将其转换为 NULL

    我有一个清单BELGIAN COAST list包含数百个数据帧 df1 df2 15 列 X 1000 行 每个数据帧的最后一列称为Chemicals并包含一些字符 例如Sulfate or Ammonia 但是这一列有很多行Chemic
  • 从 R 环境中删除对象

    我正在阅读 Hadley 的 Advanced R 在第 8 章中 他说我们可以使用以下方法从环境中删除对象 rm 但是 移除该物体后我仍然可以看到该物体 这是我的代码 e lt new env e a lt 1 e b lt 2 e a
  • R.matlab/readMat:readTag(this) 中出错

    我正在尝试使用 R matlab 将 matlab 文件读入 R 但遇到此错误 require R matlab r lt readMat file mat verbose T Trying to read MAT v5 file stre
  • 当每个记录都是一个段落并且某些记录有 4 个字段而其他记录有 6 个字段时,如何将文本文件读入 R

    如何读取文本文件 其中每条记录都是一个段落 每个换行符表示单独的字段 复杂的是 有些记录有 4 行 有些记录有 6 行 当字段数量的差异为 1 时 DWin 解决了我的问题 但当字段数量差异为 2 时 一切都崩溃了 你可以有一个在这里看看他
  • R 编程:如何计算数据框中两个单元格之间的差异并将它们保存在新列中

    尝试学习 R 并陷入自相关示例中 我想将 x 的差异与 y 的差异进行回归 我在数据框中有 x 和 y 并且希望将 x2 x1 的差值保存在新列 例如 dx 中 我不知道该怎么做 我拥有的 data1 x y 5 3 8 9 3 1 1 5
  • 将 sf voronoi 多边形裁剪到边界框时出错

    我正在尝试将 voronoi polygons 使用 sf package 创建 剪辑 到边界框 但它引发了我无法定义的错误 我对 R 的空间世界不太有经验 感谢所有帮助 样本数据 stations lt structure list ST
  • 比较 R 中的两个字符向量

    我有两个 ID 字符向量 我想比较这两个字符向量 特别是我对以下数字感兴趣 A和B各有多少个ID 有多少个ID在A中但不在B中 有多少个ID在B但不在A 我还想画维恩图 以下是一些可以尝试的基础知识 gt A c Dog Cat Mouse
  • 如何将此“for”循环转换为向量解

    这个问题与 将嵌入其他文本的长州名称转换为两个字母的州缩写 https stackoverflow com questions 25582518 convert long state names embedded with other te
  • 为什么这些数字不相等?

    下面的代码显然是错误的 有什么问题 i lt 0 1 i lt i 0 05 i 1 0 15 if i 0 15 cat i equals 0 15 else cat i does not equal 0 15 i does not eq
  • R 中的字符串作为函数参数

    数据框chocolates列出了糖果的类型以及每种糖果的一组评级 ID sweetness filling crash snickers 0 67 0 55 0 40 milky way 0 81 0 53 0 56 我正在编写一个函数 它
  • ggplot散点图中的图例问题

    我想使用 ggplot 创建显示方法比较数据的散点图 绘图应包含原始数据 理想线和带误差的拟合线 图例应显示理想线和拟合线的线型 线宽 线颜色 我可以获得大部分我想要的东西 但是图例存在以下问题 图例显示每种线型有 2 条线 为什么 如何解
  • 如何在R中同时对三个字段进行网络分析

    如何在 R 中同时对三个字段进行网络分析 下面是示例数据以及desired output在最后一栏中 df lt data frame stringsAsFactors FALSE id 1 c ABC ABC BCD CDE DEF EF
  • 为什么 geom_boxplot 比基本箱线图识别更多异常值?

    这是一个可重复的示例 与基本箱线图相比 最后一个治疗组又发现了一个异常值 dta lt structure list Treatment c A A A A A A A A A A A A A A A A B B B B B B B B B
  • GGPLOT2:如何在 ggplot() 脚本中绘制特定选择

    这是一个名为的大型数据集的峰值P 其中有 10 个优惠 CS 有不同的商店 SHP 具有多个数值 数据集列出了按周排序的它们 WK 2 tm 52 它创建一个大文件 仅前 6 行出现峰值 WK MND CS SHP RevCY RevLY

随机推荐

  • 通过Arduino ESP8266向闪存文件系统上传文件

    通过Arduino ESP8266向闪存文件系统上传文件 下载 Arduino ESP8266闪存文件插件程序 您有两种方法可以下载该插件程序 第一种方法是通过点击此链接进入 Arduino ESP8266官方GitHub页面下载 详情请见
  • Linux Vmlinux反汇编操作和 oops stack 回朔分析

    1 Linux Vmlinux反汇编操作和代码分析 1 1 对vmlinx反汇编 arm linux gnueabi objdump d vmlinux gt debug s 1 2 debug s代码段分析 vmlinux file fo
  • Android框架源码分析——以Arouter为例谈谈学习开源框架的最佳姿势

    得意于众多项目和第三方库的开源 开发中使用几行代码即可实现复杂的功能 但使用只是源码库的搬运工 源码中真正牛逼的技术并不属于我们 所以对源码和开源库的学习成了Android开发者提升技能的必经之路 笔者也曾经认真学习了常用开源框架的原理和实
  • ant-design-vue 图片预览组件,支持旋转,放大缩小,下载

    图片预览组件 支持旋转 放大缩小 下载 图片预览组件 支持旋转 放大缩小 下载 复制代码
  • 【华为OD机试真题 Python】快速开租建站(100%通过)

    前言 本专栏将持续更新互联网大厂机试真题 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于大厂机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun0
  • Promise的九大方法(resolve、reject、then、catch、finally、all、allSettled、race、any)你都用过那些?

    前言 定期复盘 今天我们来复习一下 Promise 的几个方法 分别是 Promise resolve Promise reject Promise then Promise catch Promise finally Promise al
  • linux怎样切换成root用户

    输入命令 su root 即可 如果是使用vagrant的话 密码默认为vagrant
  • 基于stm32f407VGT6控制WS2812的TIM1+PWM+DMA实现方式

    项目中使用到了ws2812灯带 作为产品的外观显示灯 经过开发之后 整理一下 仅供大家参考 WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源 其外型与一个5050 LED灯珠相同 每个元件即为一个像素点 像素点内部包含了智
  • 达梦数据库ODBC连接异常问题

    一 ODBC介绍 ODBC 即开放数据库连接Open Database Connectivity 是为解决 异构数据库间的数据共享而产生的一种数据库访问接口标准 ODBC 为异构数据库访问提供统一接口 允许应用程序以SQL 为数据存取标准
  • linux内核参数注释与优化

    linux内核参数注释与优化 目录 1 linux内核参数注释 2 两种修改内核参数方法 3 内核优化参数生产配置 参数解释由网络上收集整理 常用优化参数对比了网上多个实际应用进行表格化整理 使查看更直观 学习linux也有不少时间了 每次
  • 拓扑排序(最大食物链计数、图文结合)

    拓扑排序 拓扑排序 topological sort 是指由某个集合上的一个偏序得到该集合上的一个全序的操作 拓扑排序常用来确定一个依赖关系集中 事物发生的顺序 拓扑排序是对有向无环图的顶点的一种排序 它使得如果存在一条从顶点A到顶点B的路
  • Eclipse使用教程

    Eclipse使用教程 目录 1 Eclipse的基本概念 2 Eclipse创建Java文件 3 eclipse 代码提示功能 4 快捷键的使用 5 代码自动生成功能 6 代码注释 7 代码重构 重点 下载软件 Eclipse官方网站 点
  • 最近的一些感想

    我正在经历入行以来规模最小的一个项目 但是我却要使用很多的复杂技术 我已经为它实现了一个微型状态机 接下来我还要研究规则引擎 甚至可能还要自定义通讯协议 麻雀虽小 五脏俱全 沟通永远是最重要 最困难的事情 可是我永远也无法说服任何人 谁都有
  • 算法题记录2:跳格子问题

    题目 存在一个数组 0 1 2 3 1 2 3 其中包含的数字可能相同可能不同 跳格子规则 不同的相邻数字只能一个一个跳 而相同的数字可以无视数组中的距离 一步即达 问题 问从初始位置到数组末尾需要跳多少次 示例 0 1 2 3 4 5 6
  • [深入研究4G/5G/6G专题-35]: URLLC-6-《中国联通5G URLLC技术白皮书3.0版本》解读-2-无线侧关键技术

    目录 第3章 URLLC关键技术之无线接入网技术 3 1 无线接入网技术 3 1 1 低延时增强技术
  • 分部积分题型总结笔记(分部积分超强拓展)

    分部积分在考研中的重要性不用多说了 是很多题目解题的关键 我从李林880 张宇1000题 汤家凤1800中 对分部积分常考的六类题型进行了总结 见下 分部积分的作用 基础好的可跳过 分部积分的初始表达式如下 u v d x u v u v
  • Python项目打包, docker build构建docker镜像, Docker Compose (Docker编配)

    重点摘要 将本地Python项目打包构建docker镜像 并在docker中运行 流程1 8 8 Docker Compose Docker编配 附录 其他常用docker命令 1 首先 完成本地Python的开发 测试 2 1 将项目依赖
  • QT5.9.3中debug问题:DirectWrite: CreateFontFaceFromHDC() failed (Unknown error 0x88985000.) for QFontDef

    今天在迁移同时的代码的时候遇到如下问题 从QT4 8 6迁移到QT5 9 3 MSVC2015 32bit DirectWrite CreateFontFaceFromHDC failed Unknown error 0x88985000
  • SD卡小结

    最近应老板要求 用mega328P做了一个小板用来将串口接收的数据存在SD卡中 主要是保存长时间的一个其他板子的串口log而做的一个小板子 停停顿顿将近2周才做完 中间还做了其他的事情 当然主要原因是水平有限 以前没怎么接触过SD卡和FAT
  • R语言构造扑克牌自动发牌,洗牌

    在R语言构建自动洗牌 发牌 要求 自动洗牌 发牌 任务一 创建一副牌 学会如何使用R的数据类型和数据结构 任务二 编写发牌和洗牌的函数 学习从一个数据集中抽取想要的数值 首先需要创建一副牌 不包括大小王 从R语言的数据对象来看 数据框最合适