第三章:R语言编程 第六节:模块模式

2024-03-06 13:44

本文主要是介绍第三章:R语言编程 第六节:模块模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

模块是一种结构,由无法从外部访问的数据以及操纵这些数据的函数组成,是标准化代码编写技术

模块模式的优点

1.因为无法从外部访问数据,所以很好的隐藏了内部实现,说人话就是无需考虑数据在模块内部是如何保存的

2.其次,因为只能借助实现定义的函数访问模块内部数,所以可以有效防止不了解模块内部数据结构的用户对数据进行误操作,避免对数据造成损伤

3.由于模块用户无法触碰模块内部结构,只能调用其暴露在外的函数,所以模块制作者可以随意修改函数内部结构和模块中的数据结构,只要保证修改后的——用户调用那个函数时能够得到与以前相同的结果

队列

队列是一种“先进先出”的数据结构,由三个函数实现:Enqueue:向队尾添加数据;Dequeue:向队首取出数据并移除该数据;size:队列长度,即保存数据的个数

我们先用R语言简单编写一个队列函数

q<-c()q_size<-0Enqueue<-function(data){q<<-c(q,data)q_size<<-q_size+1}Dequeue<-function(){first<-q[1]q<<-q[-1]q_size<<-q_size-1return(first)}size<-function(){return(q_size)}

下面是函数的使用

> Enqueue(1)
> Enqueue(2)
> Enqueue(3)
> print(size())
[1] 3
> print(Dequeue())
[1] 1

编写队列模块

上述代码有一个缺点,就是q是全局变量,我们可以直接在其他地方直接操作q而不用通过Enqueue函数,所以会导致数据完整性被破坏

例如:

> q<-c(q,5)
> print(size())
[1] 2

原本队列的长度为2;我们在外部给q添加了5,但是由于没有调用Enqueue,导致队列的size一直为2

如何解决这个问题,就需要将队列全部代码与相关变量隐藏到1个函数中去

quene<-funcation(){q<-c()q_size<-0Enqueue<-function(data){q<<-c(q,data)q_size<<-q_size+1}Dequeue<-function(){first<-q[1]q<<-q[-1]q_size<<-q_size-1return(first)}size<-function(){return(q_size)}return(list(Enqueue=Enqueue,Dequeue=Dequeue,size=size)) #这样做的目的是将这些函数作为结果一并返回,使得在调用quene()函数时可以直接访问和使用这些函数。}

然后每次调用queue函数的时候,其局部变量qq_size生成的空间都会被重新创建,这意味着,即便创建多个queue()函数,他们之间的数据也不会受到影响

> q<-queue()
> r<-queue()
> q$Enqueue(1)
> r$size()
[1] 0
> r$Enqueue(1)
> q$Enqueue(2)
> q$size()
[1] 2
> r$size()
[1] 1

这篇关于第三章:R语言编程 第六节:模块模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/780232

相关文章

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M