当前位置: 首页 > news >正文

【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:包的描述通常很长,跨越多行。
      •  第二行及随后的行应缩进,
      • 通常是缩进四个空格。 

 
4.1 依赖:包需要什么

描述文件需要列出该包所依赖的包。R有很多方法来描述潜在的依赖关系。

Imports和Suggests使用逗号分隔的包名列表。我建议每行放一个包名, 并按字母顺序排
列。这将易于快速阅读。
Imports和Suggests的不同在于依赖的程度。

  • Imports(输出)
    • 为使包能够工作, In ports列表里的包必须安装。事实上, 任何时候, 如果包被安装,
      这些包也将会被安装,如果以前没有安装的话(devtools::Load_alL() 也会检查那些已
      安装的包)。
  • 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(描述文件) 的作用是存储包中重要的元数据。当第一次开发包时&#xff0c; 你会 使用这个文件记录包运行时所需要的包。然而&#xff0c;随着时间的流逝&#xff0c;当开始与他人分享包 时&#xff0c;元数据文件变得越来越重要&#xff0c;因为它指定了谁可以使用它…...

Office办公软件之word的使用(一)

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

OpenGL+QT实现矢量和影像的叠加绘制

一、QT下OpenGL框架的初始化 OpenGL的介绍我在这里就没有必要介绍了&#xff0c;那OpenGL和QT的结合在这里就有必要先介绍一下&#xff0c;也就是怎么使用QT下的OpenGL框架。要想使用QT下的OpenGL框架&#xff0c;就必须要子类化QGLWidget&#xff0c;然后实现。 void initia…...

vue基础——java程序员版(vuex)

​ vuex可以定义共享数据。 1、主要结构 src/store/index.js 是使用vuex的核心js文件。 定义数据&#xff1a;state 修改数据(同步)&#xff1a;mutations 修改数据(异步)&#xff1a;action调用>mutations 下面定义了一个公共数据msg &#xff0c;mutations方法setName…...

ubuntu20.04安装 ffmpeg 开发环境

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

微软开源Garnet高性能缓存服务安装

Garnet介绍 Garnet是一款微软研究院基于C#开发而开源的高性能缓存服务&#xff0c;支持Windows、Linux多平台部署&#xff0c;Garnet兼容Redis服务API&#xff0c;在性能和使用架构上较Redis有很大提升&#xff08;官方说法&#xff09;&#xff0c;并提供与Redis一样的命令操…...

云计算系统管理(ADMIN)

01. 公司需要将/opt/bjcat3目录下的所有文档打包备份&#xff0c;如何实现&#xff1f; 答案&#xff1a; # tar -czf /tmp/bjcat3.tar.gz /opt/bjcat302. 简述创建crontab计划任务的流程 答案&#xff1a; 利用crontab –e -u 用户名 进入计划任务编辑模式 分 时 日 月 周 …...

Spark spark-submit 提交应用程序

Spark spark-submit 提交应用程序 Spark支持三种集群管理方式 Standalone—Spark自带的一种集群管理方式&#xff0c;易于构建集群。Apache Mesos—通用的集群管理&#xff0c;可以在其上运行Hadoop MapReduce和一些服务应用。Hadoop YARN—Hadoop2中的资源管理器。 注意&…...

IOS面试题编程机制 51-55

51. 在iPhone应用中如何保存数据?有以下几种保存机制: 1).通过web服务,保存在服务器上 2).通过NSCoder固化机制,将对象保存在文件中 3).通过SQlite或CoreData保存在文件数据库中52. 阐述Block 的理解?并写出一个使用Block执行UIVew动画?Block是可以获取其他函数局部变量的…...

话题——AI大模型学习

AI大模型学习 在当前技术环境下&#xff0c;AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff0c;还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xff0c;AI大模型学习能够不断提升模型的准确性和效率&#xff0c;为人类生活和工作…...

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 案例分析 官网&#xff1a;Apache ZooKeeper 一 序列化与反序列化 …...

人工智能之Tensorflow变量作用域

在TensoFlow中有两个作用域&#xff08;Scope&#xff09;&#xff0c;一个时name_scope ,另一个是variable_scope。variable_scope主要给variable_name加前缀&#xff0c;也可以给op_name加前缀&#xff1b;name_scope给op_name加前缀。 variable_scope 通过所给的名字创建或…...

ElasticSearch插件安装及配置

Docker安装ElasticSearch docker compose 安装直接看步骤三&#xff1a;新建索引 1、安装elasticsearch &#xff08;1&#xff09;下载elasticsearch和kibana docker pull elasticsearch:7.9.1 docker pull kibana:7.9.1&#xff08;2&#xff09;配置 mkdir -p /mydata/…...

vue+Echarts实现多设备状态甘特图

目录 1.效果图 2.代码 3.注意事项 Apache ECharts ECharts官网&#xff0c;可在“快速上手”处查看详细安装方法 1.效果图 可鼠标滚轮图表和拉动下方蓝色的条条调节时间细节哦 &#xff08;注&#xff1a;最后一个设备没有数据&#xff0c;所以不显示任何矩形&#xff09;…...

STM32使用滴答定时器实现delayms

在STM32上使用SysTick实现jiffies&#xff08;时间戳&#xff09;并且实现delay_ms 代码实现&#xff1a; volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断&#xff0c;jiffies增加 */jiffies; }uint32_t tick…...

k8s的volumn解析

背景 k8s中有一套自己的存储逻辑&#xff0c;它和docker中的volumn类似&#xff0c;本文就来看一下k8s的volunm的存储设计 k8s的volumn 1.EmptyDir类型的volumn 这种类型的volumn是Pod内的容器共享的&#xff0c;volumn的生命周期和Pod的生命周期是一致的&#xff0c;不过大…...

Golang获取音视频时长信息

文章目录 一、工具简介二、使用golang获取时间长 一、工具简介 这些工具都是与多媒体处理和流媒体相关的开源工具&#xff0c;它们都属于 FFmpeg 多媒体框架。 FFmpeg 是一个用于处理多媒体内容&#xff08;音频、视频、图像等&#xff09;的命令行工具。它可以执行各种各样…...

LeetCode 面试经典150题 14.最长公共前缀

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

自注意力机制的理解

一、自注意力要解决什么问题 循环神经网络由于信息传递的容量以及梯度消失问题&#xff0c;只能建立短距离依赖关系。为了建立长距离的依赖关系&#xff0c;可以增加网络的层数或者使用全连接网络。但是全连接网络无法处理变长的输入序列&#xff0c;另外&#xff0c;不同的输…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; 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_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...