当前位置: 首页 > 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;不同的输…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...