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

目录

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

注:如果已经安装了这个包,但是发现还需要对这个包做些修改,可以在R的安装地,lib文件夹中找到这个包,删掉即可,这样可以重新进行包的安装,否则在安装包的时候,会提示存在Error,这个提示是清楚的,清楚的写明了这个R包存在lib的位置。 

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的截图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stm32串口通信(PC--stm32;中断接收方式;附proteus电路图;开发方式:cubeMX)

单片机型号STM32F103R6: 最后实现的效果是,开机后PC内要求输入1或0,输入1则打开灯泡,输入0则关闭灯泡,输入其他内容则显示错误,值得注意的是这个模拟的东西只能输入英文 之所以用2个LED灯是因为LED电阻粗略一算就是1…

Linux(实操篇一)

Linux实操篇 Linux(实操篇一)1. 常用基本命令1.1 帮助命令1.1.1 man获得帮助信息1.1.2 help获得shell内置命令的帮助信息1.1.3 常用快捷键 1.2 文件目录类1.2.1 pwd显示当前 工作目录的绝对路径1.2.2 ls列出目录的内容1.2.3 cd切换目录1.2.4 mkdir创建一个新的目录1.2.5 rmdir删…

Bigemap在路桥行业是怎么应用的?

选择Bigemap的原因: 奥维下架了,后来了解到的bigemap,于是测试了这款软件 使用场景: 下载影像、矢量路网做前期策划,下载完数据后导出cad ,做一些标注,最终出图下载等高线,作为前期选址依据 …

java八股文面试[多线程]——线程的生命周期

笔试题:画出线程的生命周期,各个状态的转换。 5.等待队列(本是Object里的方法,但影响了线程) 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) 代码段内。与等待队列相关的步骤和图 …

股票预测和使用LSTM(长期-短期-记忆)的预测

一、说明 准确预测股市走势长期以来一直是投资者和交易员难以实现的目标。虽然多年来出现了无数的策略和模型,但有一种方法最近因其能够捕获历史数据中的复杂模式和依赖关系而获得了显着的关注:长短期记忆(LSTM)。利用深度学习的力…

[MyBatis系列⑥]注解开发

🍃作者简介:准大三本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐MyBatis系列①:增删改查 ⭐MyBatis系列②:两种Dao开发方式 ⭐MyBatis系列③:动态SQL ⭐MyBatis系列④:核心…

Postman API测试之道:不止于点击,更在于策略

引言:API测试的重要性 在当今的软件开发中,API已经成为了一个不可或缺的部分。它们是软件组件之间交互的桥梁,确保数据的流动和功能的实现。因此,对API的测试显得尤为重要,它不仅关乎功能的正确性,还涉及到…

android framework之Applicataion启动流程分析

Application启动流程分析 启动方式一:通过Launcher启动app 启动方式二:在某一个app里启动第二个app的Activity. 以上两种方式均可触发app进程的启动。但无论哪种方式,最终通过通过调用AMS的startActivity()来启动application的。 根据上图…

论文解读 | ScanNet:室内场景的丰富注释3D重建

原创 | 文 BFT机器人 大型的、有标记的数据集的可用性是为了利用做有监督的深度学习方法的一个关键要求。但是在RGB-D场景理解的背景下,可用的数据非常少,通常是当前的数据集覆盖了一小范围的场景视图,并且具有有限的语义注释。 为了解决这个问题&#…

数据仓库一分钟

简介 数据仓库(Data Warehouse)简称DW或DWH,是数据库的一种概念上的升级,可以说是为满足新需求设计的一种新数据库,而这个数据库是需容纳更多的数据,更加庞大的数据集,从逻辑上讲数据仓库和数据…

Midjourney API 的对接和使用

“ 阅读本文大概需要 4 分钟。 ” 在人工智能绘图领域,想必大家听说过 Midjourney 的大名吧。 Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作,只要简单输入绘图指令,这个神奇的工具就能在瞬间为我们呈现出对应的图像。无…

Git企业开发控制理论和实操-从入门到深入(七)|企业级开发模型

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

8.7.tensorRT高级(3)封装系列-调试方法、思想讨论

目录 前言1. 模型调试技巧总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-调试方法、思想讨论 课程大纲可看…

知虾shopee数据分析工具:shopee出单的商机利器

当今数字化时代,数据已经成为商业成功的关键要素之一。而Shopee作为东南亚最大的电商平台之一,其强大的数据分析工具正为商家提供了宝贵的市场洞察和决策支持。本文将深入探讨Shopee数据分析工具如何帮助商家抓住商机并取得成功。 洞察消费者需求&#x…

P21~22 第六章 储能元件——电容存储电场能,电感存储磁场能

1、电容元件 a定义 b线性时不变电容元件 c电容的电压与电流关系 i有限则u有限 注意理解面积 d电容的功率和储能 e例一 跃变就是指物体的物理量从有限值变为无限值的过程。 分析上图例题:对于电源波形要吃负无穷到正无穷去刻画。即时间轴要铺满。 有有图控制电…

sql:SQL优化知识点记录(四)

(1)explain之ref介绍 type下的ref是非唯一性索引扫描具体的一个值 ref属性 例如:ti表先加载,const是常量 t1.other_column是个t1表常量 test.t1.ID:test库t1表的ID字段 t1表引用了shared库的t2表的col1字段&#x…

python可视化matplotlib——绘制正弦和余弦

这是一个使用matplotlib库绘制正弦和余弦函数曲线的代码示例。代码中导入了需要的库,并设置了x轴和y轴的标签字体为华文楷体。然后,使用numpy生成一组x轴上的值t,并使用正弦函数生成对应的y轴值s,再使用余弦函数生成对应的y轴值z。…

Java学数据结构(1)——抽象数据类型ADT 表List、栈Stack和队列Qeue

目录 引出抽象数据类型(abstract data type,ADT)表ListArrayList,Vector, LinkedListArrayList手动实现与分析Vector的分析(线程安全)LinkedList 的手动实现与分析 栈stack—后进先出java中stack源码分析栈的应用:检查…

创邻科技张晨:图数据库,激活数据要素的新基建

“数据经济时代,数据要素产业链的各细分领域均蕴含机遇,图技术作为网络协同和数据智能的底层发动机,将深度掘金数字中国价值潜能”。 8月22日,在2023中国(南京)国际软件产品和信息服务交易博览会的信息技术…

Day48|leetcode 198.打家劫舍、213.打家劫舍II、打家劫舍|||

leetcode 198.打家劫舍 题目链接:198. 打家劫舍 - 力扣(LeetCode) 视频链接:动态规划,偷不偷这个房间呢?| LeetCode:198.打家劫舍_哔哩哔哩_bilibili 题目概述 你是一个专业的小偷,…