【R包开发:包的组件】 第4章 包的元数据
DESCRIPTION(描述文件) 的作用是存储包中重要的元数据。当第一次开发包时, 你会
使用这个文件记录包运行时所需要的包。然而,随着时间的流逝,当开始与他人分享包
时,元数据文件变得越来越重要,因为它指定了谁可以使用它(许可证),以及如果包有
什么问题时需要和谁(你!)联系。
每一个包必须有一个DESCRIPTION。事实上, 它是包的定义特征(R Studio和devtools
把任何包含DESCRIPTION的目录都视为一个包) 。为方便你开始, devtools::create
("mypackage") 会自动添加一个描述文件框架。这让你可以开始进行包开发而无需担心元
数据的问题,直到需要时才去关心它。
最小的描述文件会依据设置而有所不同,但它看起来应该是这样的:
Package:my package
TitLe:What The Package Does(one line, title case required)
Version :0.1
Authors@R:person("First","Last",email = "first.lastdexample.com",role=c("aut""cre"))
Description:What the package does(one paragraph)
Depends:R(>=3.1.0)
License:What Licenseis it under?
Lazy Data:true
- DESCRIPTION使用一个称为Debian控制格式 (Debian control format,DCF) 的简单文件格式。可以通过下面所示的简单例子看到它的大部分结构。它每行包括一个域的名字和一个值,中间用冒号分开。当值跨越多行时,需要缩进:
- Description:包的描述通常很长,跨越多行。
- 第二行及随后的行应缩进,
- 通常是缩进四个空格。
- Description:包的描述通常很长,跨越多行。
4.1 依赖:包需要什么
描述文件需要列出该包所依赖的包。R有很多方法来描述潜在的依赖关系。
Imports和Suggests使用逗号分隔的包名列表。我建议每行放一个包名, 并按字母顺序排
列。这将易于快速阅读。
Imports和Suggests的不同在于依赖的程度。
- Imports(输出)
- 为使包能够工作, In ports列表里的包必须安装。事实上, 任何时候, 如果包被安装,
这些包也将会被安装,如果以前没有安装的话(devtools::Load_alL() 也会检查那些已
安装的包)。
- 为使包能够工作, In ports列表里的包必须安装。事实上, 任何时候, 如果包被安装,
- Suggests (建议)
- 你的包可以使用这些包,但它们不是必需的。比如你可能会使用建议包中的数据包来运
行测试、编译使用指南,或者只有一个函数需要那个包。 - 在本地开发包时, 永远不需要使用Suggests。当发布包时, 使用Suggests对用户而言很方便。这样他们就不必下载很少使用的包,进而可以以最快的速度来使用你的包。
- 你的包可以使用这些包,但它们不是必需的。比如你可能会使用建议包中的数据包来运
要为包添加In ports和Suggests, 最简单的方法是使用devtools::use_package() 。这会自
动把它们放在DESCRIPTION文件中正确的位置, 并提醒你如何使用它们
4.1.1版本
如果需要一个特定版本的包,则在包名后面的括号中指定它:
Imports:ggvis(>=0.2) ,dplyr(>=0.3.0.1)
Suggests:MASS(>=7.3.0)
我们几乎总是指定一个最小的版本, 而不是一个精确的版本(MASS(==7.3.0))。因为R不能同时装载一个包的多个版本,所以指定一个确切的版本依赖大大地增加了出问题的机会。版本控制是发布包时最重要的事情。通常人们不会和你有版本完全相同的包。如果有人有一个旧版本的包,而其中没有你的包需要的函数,那他会得到一条没有任何帮助的错误消息。但是,如果你提供了版本号,他就会得到一个明确的错误消息:一个过时的包。
一般而言,好的做法是指定版本,并且保守地指定需要的版本。除非你知道,否则就总是
指定一个大于等于你目前使用的版本。
4.1.2其他依赖
Depends (依赖)
使用Depends来指定一个特定的R版本
LinkingTo (链接到)
这里列出的包依赖于另一个包中的C或者C++代码。
Enhances (增强)
这里列出的包是你的包“增强”了的包。通常,这意味着你的包为其他包里的类提供了方法(反过来的Suggests) 。但很难确切定义这是什么意思, 所以不建议使用Enhances。
4.2 标题和描述:包是做什么
标题和描述域描述包做了些什么。它们的区别只在于长度。
Title(标题)是包的一行描述,经常显示在包列表中。它应该是纯文本(无标记),并在大小写上遵循标题风格;它不应该以句号号结束。保持简短:列表通常会截掉标题中超出65个字符的部分。
Description(描述)比标题更详细。可以使用多个句子,但只限于一段。如果描述跨越多行((应该如此!),每行必须不超过80个字符。用四个空格缩进后续的行。
4.3作者:你是谁
利用Author@R域来指定包的作者, 以及如果包有什么问题该和谁联系。这个域是独特的,
因为它包含可执行的R代码,而不是纯文本。下面是一个例子:
Authors@R:person("HadLey","Wickham", enail="hadley@rstudio.com",role=c("aut","cre"))
该命令说, 包的作者(aut) 和维护者(cre) 都是Hadley Wickham,他的电子邮件地址是
hadley@rstudio.com。person() 函数有以下四个主要参数。
- 名字,由前两个参数指定,名和姓(这些参数由位置确定,没有参数名)。在西方文化中,
- 名在姓的前面,但是在许多东方文化中并没有这个习惯。
- email地址。
- 三个字母的代码用来指定角色(role) ,有四个重要的角色。
- cre, 创建者或者维护者, 也就是你遇到问题时需要联系的人。
- aut, 作者, 对包作出重大贡献的人。
- ctb, 贡献者, 作出了较小贡献的人, 比如提供了一些补丁。
- cph, 版权所有人。用在下面这种情况:版权是作者以外的人, 通常是一个公司(即作者的雇主)。
4.4许可证:谁能使用包
许可证((License))域可以是一个开源许可证的标准缩写, 比如GPL-2或BSD, 也可以指向
包含更多信息的文件——文件许可丁(fileLICENSE) 。如果计划发布包,该许可证是非常重
要的。如果不打算发布,可以忽出咯这个部分。如果想清楚地说明包不是开源的,使用许可
证:文件许可证(License:fileLICENSE) , 然后创建一个文件LICENNSE, 例如包含:
Proprietary
Do not distribute outside of Widgets Incorporated.
开源软件许可证是一个丰富而复杂的域。幸运的是,在我看来,只需为R包考虑三种许可证:
- MIT(https://tldrlegal.com/license/mit-license)
- 这是一个简单的、类似于BSD-2-clause或BSD-3-clause的许可证。它让人们使用和自由分发你的代码, 但是有一个限制:许可证必须始终和代码一起分发。
- GPL-2 (https://tldrlegal.com/license/gnu-general-public-license-v2) 或者 GPL-3 (https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3))
- 这些都是“许可证保留”(copy-left) 许可证。这意味着任何包含你的代码的包都必须使用GPL兼容的许可证来发布。此外, 任何人发布你代码的修改版本(衍生作品)时,必须公布源码
- CC0(https://tldrlegal.com/license/creative-commons-cc0-1.0-universal)
- 这个许可证放弃了你对代码和数据的所有权利,这样任何人都可以自由地把它用于任何目的。这有时被称为“把它放在公共领域”,在所有的国家,它都是一个既没有明确定义也没有意义的术语。此许可证最适合数据包。
4.5版本
正式的情况下,R包的版本是一个用.或者-分隔的至少有两个整数的序列。
发布的版本包括三个数字,<主版本号><次版本号><补丁版本>。对于版本数1.9.2,1
是主要版本,9是次要版本,2是补丁版本。永远不要使用像1.0这样的版本号;请总是把
三个版本号写出来(即1.0.0)。
4.6其他域
其他的一些域会在本书的其他地方说明。
- Collate控制R文件被加载的顺序。这只在代码有副作用(最常见的原因是使用S4)时有用。
- Lazy Data使得访问包中的数据更容易。因为它很重要, 所以devtools创建的最小描述文件中包含了它。
参考文献
中文书籍 (ituring.com.cn)
R Packages (2e) (r-pkgs.org)
英文书籍Writing R Extensions (r-project.org) (官方 R 扩展开发手册)
相关文章:
【R包开发:包的组件】 第4章 包的元数据
DESCRIPTION(描述文件) 的作用是存储包中重要的元数据。当第一次开发包时, 你会 使用这个文件记录包运行时所需要的包。然而,随着时间的流逝,当开始与他人分享包 时,元数据文件变得越来越重要,因为它指定了谁可以使用它…...

Office办公软件之word的使用(一)
前几天调整公司招标文件的格式,中途遇到一些问题,感觉自己还不是太熟悉操作,通过查阅资料,知道了正确的操作,就想着给记下来。如果再次遇到,也能很快地找到解决办法。 一、怎么把标题前的黑点去掉 解决办法…...

OpenGL+QT实现矢量和影像的叠加绘制
一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了,那OpenGL和QT的结合在这里就有必要先介绍一下,也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架,就必须要子类化QGLWidget,然后实现。 void initia…...
vue基础——java程序员版(vuex)
vuex可以定义共享数据。 1、主要结构 src/store/index.js 是使用vuex的核心js文件。 定义数据:state 修改数据(同步):mutations 修改数据(异步):action调用>mutations 下面定义了一个公共数据msg ,mutations方法setName…...

ubuntu20.04安装 ffmpeg 开发环境
参考:参考1 一些相关软件包,已打包整理好,如下 源码包 1、安装步骤 创建安装目录 sudo mkdir -p /usr/local/ffmpeg/lib 解压源码 tar -jxf ffmpeg-4.3.2.tar.bz2 到指定ffmpeg目录进行配置 cd ffmpeg-4.3.2/ 配置:会报错很多…...

微软开源Garnet高性能缓存服务安装
Garnet介绍 Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务,支持Windows、Linux多平台部署,Garnet兼容Redis服务API,在性能和使用架构上较Redis有很大提升(官方说法),并提供与Redis一样的命令操…...
云计算系统管理(ADMIN)
01. 公司需要将/opt/bjcat3目录下的所有文档打包备份,如何实现? 答案: # tar -czf /tmp/bjcat3.tar.gz /opt/bjcat302. 简述创建crontab计划任务的流程 答案: 利用crontab –e -u 用户名 进入计划任务编辑模式 分 时 日 月 周 …...

Spark spark-submit 提交应用程序
Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式,易于构建集群。Apache Mesos—通用的集群管理,可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…...
IOS面试题编程机制 51-55
51. 在iPhone应用中如何保存数据?有以下几种保存机制: 1).通过web服务,保存在服务器上 2).通过NSCoder固化机制,将对象保存在文件中 3).通过SQlite或CoreData保存在文件数据库中52. 阐述Block 的理解?并写出一个使用Block执行UIVew动画?Block是可以获取其他函数局部变量的…...
话题——AI大模型学习
AI大模型学习 在当前技术环境下,AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力,还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法,AI大模型学习能够不断提升模型的准确性和效率,为人类生活和工作…...
MySQL基础复习
目录 一、简单的命令 二、SQL语句分类 三、简单查询 四、条件查询 五、排序 一、简单的命令 net start 服务名称 net stop 服务名称 mysql -uroot -p123456 显示密码形式 mysql -uroot -p 隐藏密码形式 exit 退出 show databases; 查看MySQL中的数据库有哪些 use test…...

Zookeeper(八)序列化与协议
目录 一 序列化与反序列化1.1 Jute序列化工具1.1 Recor接口1.2 OutputArchive和InputArchive 二 通信协议2.1 请求部分2.1.1 请求头2.2.2 请求体2.1.3 案例分析 2.2 响应部分2.2.1 响应头2.2.2 响应内容2.2.3 案例分析 官网:Apache ZooKeeper 一 序列化与反序列化 …...

人工智能之Tensorflow变量作用域
在TensoFlow中有两个作用域(Scope),一个时name_scope ,另一个是variable_scope。variable_scope主要给variable_name加前缀,也可以给op_name加前缀;name_scope给op_name加前缀。 variable_scope 通过所给的名字创建或…...
ElasticSearch插件安装及配置
Docker安装ElasticSearch docker compose 安装直接看步骤三:新建索引 1、安装elasticsearch (1)下载elasticsearch和kibana docker pull elasticsearch:7.9.1 docker pull kibana:7.9.1(2)配置 mkdir -p /mydata/…...

vue+Echarts实现多设备状态甘特图
目录 1.效果图 2.代码 3.注意事项 Apache ECharts ECharts官网,可在“快速上手”处查看详细安装方法 1.效果图 可鼠标滚轮图表和拉动下方蓝色的条条调节时间细节哦 (注:最后一个设备没有数据,所以不显示任何矩形)…...

STM32使用滴答定时器实现delayms
在STM32上使用SysTick实现jiffies(时间戳)并且实现delay_ms 代码实现: volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断,jiffies增加 */jiffies; }uint32_t tick…...
k8s的volumn解析
背景 k8s中有一套自己的存储逻辑,它和docker中的volumn类似,本文就来看一下k8s的volunm的存储设计 k8s的volumn 1.EmptyDir类型的volumn 这种类型的volumn是Pod内的容器共享的,volumn的生命周期和Pod的生命周期是一致的,不过大…...
Golang获取音视频时长信息
文章目录 一、工具简介二、使用golang获取时间长 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源工具,它们都属于 FFmpeg 多媒体框架。 FFmpeg 是一个用于处理多媒体内容(音频、视频、图像等)的命令行工具。它可以执行各种各样…...

LeetCode 面试经典150题 14.最长公共前缀
题目: 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 ""。 思路: 代码: class Solution {public String longestCommonPrefix(String[] strs) {if (strs.length 0) {return &…...

自注意力机制的理解
一、自注意力要解决什么问题 循环神经网络由于信息传递的容量以及梯度消失问题,只能建立短距离依赖关系。为了建立长距离的依赖关系,可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列,另外,不同的输…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...