创建R包-2.2:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)

news2024/9/28 11:24:17

目录

4-添加C++函数

5-编辑元数据

 6-启用Roxygen,执行文档化。

7-单元测试

8-在自己的计算机上安装R包:

9-程序发布

参考:


为什么要写这篇文章的更新日期?因为R语言发展很快,很多函数或者方式,现在可以使用,不代表之后的若干年之后,还可以用,可能那个时候有更方便且快捷的操作方式。

4-添加C++函数

有的时候,为了让R代码运行速度快一些,可能会借助一些编译语言,如C++。R是一门高级的、富有表现力的语言,但这事以速度为代价的,这就是为什么结合低级的编译语言(如C或者C++)可以有力地补充你的代码。虽然C和C++往往需要更多的代码行(和更仔细地思考)来解决同样地问题,但它们的速度可以比R快上几个数量级。

cpp = c plus plus = c++

c++函数函数可以直接在R中使用的接口为 Rcpp包(名字取得很好,R和C++)

usethis::use_rcpp("mean_rcpp")#生成一个mean_rcpp的c++文件

这个代码做了如下工作:

  • 创建一个src/目录以存放.cpp文件;
  • 在DESCRIPTION的LinkingTo和Imports域添加Rcpp;
  • 建立一个.gitignore文件,确保你不会无意中提交任何已编译的文件;
  • 在console中告诉你,需要你手动添加到报中的两个roxygen标签。(这条的具体细节在接下来的内容中会涉及到,这里不展开了。)

注意:C++代码都放在src/目录文件夹,R代码都放在R/目录文件夹,scr/目录这个文件夹是usethis::use_rcpp("c++函数名")自动生成。

 在https://github.com/coatless-r-n-d/rcpp-and-doparallel/tree/master/src 中找到我们想要生成的mena_rcpp.cpp文件,打开复制里面的内容到 我们当前打开的cpp文件。

 

 展示运行use_rcpp函数后console中的结果,√号表示这个函数完成的操作,●表示需要我们手动进行的操作。

> usethis::use_rcpp("mean_rcpp")
✔ Adding 'Rcpp' to LinkingTo field in DESCRIPTION
✔ Adding 'Rcpp' to Imports field in DESCRIPTION
• Copy and paste the following lines into 'R/ReproduceRcpp2doParallel-package.R':
  ## usethis namespace: start
  #' @importFrom Rcpp sourceCpp
  ## usethis namespace: end
  NULL
  [Copied to clipboard]
✔ Creating 'src/'
✔ Adding '*.o', '*.so', '*.dll' to 'src/.gitignore'
• Copy and paste the following lines into 'R/ReproduceRcpp2doParallel-package.R':
  ## usethis namespace: start
  #' @useDynLib ReproduceRcpp2doParallel, .registration = TRUE
  ## usethis namespace: end
  NULL
  [Copied to clipboard]
✔ Writing 'src/mean_rcpp.cpp'
• Modify 'src/mean_rcpp.cpp'

可以看到√号完成的工作内容在本文usethis::use_rcpp("mean_rcpp")函数介绍那已经介绍过了,我们重点来看下●的部分。一共有三个●,具体来说:

  1. • Copy and paste the following lines into 'R/ReproduceRcpp2doParallel-package.R':意思是将下面的行复制粘贴到R/ReproduceRcpp2doParallel-package.R文件。这个R文件是我们自己手动生成的,是"R包名字-package.R";
  2. • Copy and paste the following lines into 'R/ReproduceRcpp2doParallel-package.R':同上。
  3. Modify 'src/mean_rcpp.cpp' 修改mean_rcpp.cpp文件,意思是对创建的mean_rcpp.cpp中添加C++代码。

5-编辑元数据

每个包都必须有一个DESCRIPTION文件,它用来存放关于创建的R包的重要元数据。

打开DESCRIPTION文件,包名、编码等部分信息都是自己生成的,包括可编辑标题(单行文字)、版本号、作者、描述(一段文字)、网址等信息,导入、许可等信息更简易通过命令添加。

  • 版本号:通常是三位:大版本.小版本.补丁版本,按照数据值大小递进。
  • 依赖包:Imports下所列的包是必须存在的,因为构建的R包中使用了依赖包中的函数,当别人安装你的包的时候,也会自动安装这些包。推荐使用use_package("pkgname")的方式添加依赖包。
  • 选择许可
    • use_agpl3_license(),结果显示AGPL (>=3);
    • use_gpl3_license(),结果显示GPL(>=3).
    • use_gpl_license(version = 2)

  • LazyData为true,确保加载包时自动惰性加载(使用时才载入内存)内部数据集。

查看下面的目标,通过上述介绍的命令完成(1)添加依赖包,(2)选择许可(3)其他一些修改(如Title,作者等信息,这个不修改也可以,不影响我们复现这个R包)

 6-启用Roxygen,执行文档化。

  • Build tab -> More -> Configure Build Tools:
  • Check Generate documentation with Roxygen:
  •  Build--> More --->Document

7-单元测试

测试时开发R包的重要部分,可以确保代码更加稳健,能成功地实现相关的功能。

测试的一般原则是,设想函数可能遇到的各种情况下,是否都能得到预期的结果。策略之一是每当你遇到一个bug,就为它写一个测试,来检查函数是否能得到预期的结果。

虽然通过执行load_all()模拟加载包,可以在控制台做一些函数测试,但是更好的做法是采用testthat包提供的单元测试,这是一种正式的自动化测试。

具体操作如下:

先初始化包的单元测试:

use_testthat()

它将Suggests::testthat添加到DESCRIPTION,创建目录tests/testthat/,并添加脚本test/testthat.R。

打开或创建针对某函数的测试文件:

use_test("mean_parallel_compute")

测试文件是由若干个test_that()构成,第一个参数是对测试的描述,测试内容是大括号内的代码块,一般是比较函数返回值与期望值是否(近似)相等、是否复合类型等。

然后执行测试(若测试结果全为PASS,则表示通过测试):

test() 

如果单元测试没有问题,再执行R CMD check检测

check() 

 在控制台会输出潜在错误、警告、注意的具体反馈,我们希望三者都是0。

8-在自己的计算机上安装R包:

Build --> Install package

9-程序发布

开发完的R包,如果愿意开源给其他人使用,有几个发布平台供选择:CRAN、GitHub。

  • CRAN是大家比较熟悉的,由R Core的小组维护,审查很严格;
  • GitHub是通过devtools包维护的一个发布平台,适合个人发布,无审查。

由于CRAN平台有各种审查,不允许随便发布,那么我们就先把程序发布到GitHub上面,等功能完善后,再申请提交到CRAN。把项目上传到GitHub的操作,和R语言没有什么关系。

操作步骤为:Git--> Staged--> Commit --> Push(下面会展示具体操作细节),将包的相关文件推送到GitHub远程仓库,换句话说,将包发布到GitHub,从而别人可以从GitHub上通过devtools包可以安装和使用你的R包。

 具体步骤:

  • 点击Git

  •  单击“暂存”复选框以暂存要推送到GitHub的文件,然后单击“提交”。

  •  将打开一个新窗口,它将反映您要提交到GitHub存储库的文件。您也可以在“提交消息”文本框中编写提交消息,然后单击“提交”按钮。(不要选中“修改以前的提交”框——这只会导致灾难)值得注意的是:下图的Commit message要填写内容,这个例子中填写的是“First commit”,这个在下面第二张图可以看到。如果不再commit message中填写内容,则会终止提交,告知你因为没有commit message。提交到GitHub成功后会看到在每个文件后面看到commit message.

  •  单击“提交”按钮后,您将看到以下屏幕。单击“关闭”按钮关闭窗口。

  •  在GitHub上提交文件后,您会发现右上角窗口为空。这意味着您已将文件提交到存储库。现在,在最后一步中,您需要单击“推送”以推送存储库中的文件。

  •  最后,您将看到一个包含Git Push消息的新窗口。如果一切正确,那么不会有任何错误,您的文件已成功推送到GitHub存储库中。

  •  您还可以通过访问特定存储库在GitHub上进行交叉检查。

 通过这种方式,您可以使用RStudio Server轻松暂存、提交和推送到GitHub。

参考:

Setup an R-Package with Rcpp in RStudio | Sebastian Hanß

《R语言编程》(张敬信,2023年2月,人民邮电出版社)(这本书写的很全面且细致,没有多余的废话。)

《R包开发》(Hadley, 2016年8月,人民邮电出版社)(这本书出版的时间比较长,书中有部分函数发生了调整。)

R Packages (2e) (r-pkgs.org) (这是是R包开发的第二版,较第一版有了些内容的调整和删减,下面截图是这本书的内容,左侧是目录,右侧是正文。值得花时间阅读。)

《R的极客理想:高级开发篇》(张丹,2015年7月,机工社)

Introduction to Computational and Data Sciences (这本书也超棒!很细节。本文第9节参考的是这本书的第4.9节)

RStudio制作包含Rcpp代码的R包_rcpp package_Kanny广小隶的博客-CSDN博客

注:写CSDN一定要少用Ctrl+Z呀,有时候撤回的不是一步。

R package-2ed
这是R package 2ed的截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哲讯科技携手无锡华启动SCM定制化项目,共谋数字化转型之路

无锡华光座椅弹簧有限公司启动SCM定制化项目 近日,无锡华光座椅弹簧有限公司顺利举行了SCM定制化项目的启动会。本次启动会作为该项目实施的重要里程碑,吸引了双方项目组核心成员的共同参与,并见证了项目的正式启动。 无锡华光座椅弹簧有限公…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点,并计算…

控制台的启动日志消失了?关键在于这些步骤!

linux学习视频 每次我们启动系统的时候,控制台都会显⽰出⼀⼤堆的启动⽇志。 有时候出于保密的考虑,不希望启动⽇志直接显⽰在控制台上。⽐如⼀些安全⼚商提供的基于 Linux 的硬件设备,⾥⾯可能有⼀些内容不希望⽤⼾看到。 这时候&#xff…

胖小酱之文思泉涌

小编认为是灵感! 灵感,也叫灵感思维,指文艺、科技活动中瞬间产生的富有创造性的突发思维状态。释义:灵验;灵应。不用平常的感觉器官而能使精神互相交通,亦称远隔知觉。或指无意识中突然兴起的神妙能力。通常搞创作的学者或科学家…

Matplotlib画多幅子图重叠问题

fig.tight_layout()函数:使得子图横纵坐标更加紧凑,主要用于自动调整图区的大小以及间距,使所有的绘图及其标题、坐标轴标签等都可以不重叠的完整显示在画布上。 pad:用于设置绘图区边缘与画布边缘的距离大小w_pad:用于设置绘图区之间的水平…

【王道-第四章-文件管理】

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 初识文件管理No.2 文件的逻辑结构No.3 文件目录No.4 文件的物理结构No.5 逻辑结构VS物理结构No.6 文件存储空间管理No.7 文件的基本操作No.8 文件共享No.9 文件保护No.10 文件系统的层次结构No.11 文件系统的全局结构&a…

数字孪生交通是数字化技术与交通的创新融合

摘要:数字孪生交通数字孪生交通(digitaltwintransportation)是一种新兴的技术概念,指通过大数据分析和处理,将这些数据与数字孪生交通模型相结合,实现对交通系统的全面仿真。 数字孪生交通&#xff0…

海外ios应用商店优化排名因素之视频预览与截图

当我们找到感兴趣的应用程序并转到该应用程序的页面时,首先引起注意的是预览视频。视频旨在以更具吸引力的方式展示应用程序的用户体验和UI。视频长度最多为30秒,其中前5秒最为重要,一定要让它尽可能引人注目。 1、关于优化预览视频的提示。…

2023-08-24 LeetCode每日一题(统计参与通信的服务器)

2023-08-24每日一题 一、题目编号 1267. 统计参与通信的服务器二、题目链接 点击跳转到题目位置 三、题目描述 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台…

Eagle for Mac图片素材管理工具

Eagle for Mac是专门为mac用户设计的一款非常专业的图片素材管理软件,支持藏网页图片,网页截屏,屏幕截图和标注,自动标签和筛选等功能,让设计师方便存储需要的素材和查找,提供工作效率。 使用 Eagle 强大的…

Unity 类Scene窗口相机控制

类Scene窗口相机控制 🍔效果 🍔效果 传送门👈

【前端】CSS技巧与样式优化

目录 一、前言二、精灵图1、什么是精灵图2、为什么需要精灵图3、精灵图的使用①、创建CSS精灵图的步骤1)、选择合适的图标2)、合并图片3)、设置背景定位 ②、优化CSS精灵图的技巧1)、维护方便2)、考虑Retina屏幕3&…

开学哪款电容笔值得买?ipad2023手写笔推荐

开学有哪些电容笔值得买呢?比起之前的传统电容笔,现在的电容笔有了更多的特点,例如具有防误触,能避免手指不小心触碰到屏幕而造成书写失灵,还能任意调整线条的粗细。苹果的原装Pencil现在售价很贵。所以,在…

HarmonyOS ArkUI 属性动画入门详解

HarmonyOS ArkUI 属性动画入门详解 前言属性动画是什么?我们借助官方的话来说,我们自己简单归纳下 参数解释举个例子旋转动画 位移动画组合动画总结 前言 鸿蒙OS最近吹的很凶,赶紧卷一下。学习过程中发现很多人吐槽官方属性动画这一章比较敷…

【面试】一文讲清组合逻辑中的竞争与冒险

竞争的定义:组合逻辑电路中,输入信号的变化传输到电路的各级逻辑门,到达的时间有先后,也就是存在时差,称为竞争。 冒险的定义:当输入信号变化时,由于存在时差,在输出端产生错误&…

5G终端视频客服需求及实现方式

5G视频客服的适老化需求聚焦“远程辅助”和“触屏交互”两项功能。 需要UI、AP framework和Modem共同实现完成需求。 UI需要终端自行按需求开发实现。 芯片商提供AP framework层和modem的修改方案。 终端厂商要自行和CMCC客服端进行功能上的调试验证,完成功能认…

RTSP/Onvif视频服务器EasyNVR安防视频云服务平台出现崩溃并重启的情况解决方案

EasyNVR安防视频云服务平台的特点是基于RTSP/Onvif协议将前端设备统一接入,在平台进行转码、直播、处理及分发,在安防监控场景中,EasyNVR可实现实时监控、云端录像、云存储、告警、级联等视频能力,极大满足行业的视频监控需求。 有…

HBP人脑计划结果如何:欧洲投入6亿欧元利用计算机重建人脑?

为期十年的人脑计划将在九月份结束。《Nature》杂志审视了它的成就和动荡的过去。 来自人脑颞叶神经元回路的数字重建。来源:Nicolas Antille 人脑计划(Human Brain Project,HBP)历时长达10年,即将迎来圆满结束。这一庞…

薪火传承 | 天空卫士致敬原三线企业核工业部525厂老同志

上世纪60年代,几百万建设者开创了我国历史上一次规模空前的工业大迁移和工业大开发。创造出“艰苦创业、勇于创新、团结协作、无私奉献”的三线建设精神永为后世所敬仰和学习。 三线企业的前辈们用自己的青春和智慧为中国的科技事业作出了巨大的贡献。时光斗转&…

宠物赛道,用AI定制宠物头像搞钱项目教程

今天给大家介绍一个非常有趣,而粉丝价值又极高,用AI去定制宠物头像或合照的AI项目。 接触过宠物行业应该知道,获取1位铲屎官到私域,这类用户的价值是极高的,一个宠物粉,是连铲个屎都要花钱的,每…