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

news2024/11/20 23:35:49

目录

0-前言

1-在RStudio中创建R包项目

 2-创建R包

2.1通过R函数创建新包 

2.2在RStudio通过菜单来创建一个新包

2.3关于R包创建的说明

 3-添加R自定义函数

4-添加C++函数


0-前言

目标:在RStudio中创建一个R包,这个R包中包含C++函数,接口是Rcpp。

为了实现这个目标,我们复现一个简单的R包Rcpp2doParallel,取名ReproduceRcpp2doParallel.

这个R包的相关内容:

From: rdrr.io(可以查看这个R包中R文件)

From: GitHub (包括创建这个R包的所有文件)

1-在RStudio中创建R包项目

建立与GitHub有连接的R包项目,具体参考R包开发一:R与Git版本控制

此时,我们得到名为ReproduceRcpp2doParallel的文件夹,如下图所示:

 2-创建R包

创建R包有两种形式:

  1. 通过R函数create_package来创建新包 ;(本文使用的是该种方法创建新包)
  2. 在RStudio通过菜单来创建一个新包。(本文此处仅展示如何通过这种方式创建)

2.1通过R函数创建新包 

键入创建R包的语句,第二行语句表示在当前路径下创建一个新包,创建R包函数为create_package():

library(devtools)
create_package(getwd())

得到如下结果: 

> library(devtools)
载入需要的程辑包:usethis
> create_package(getwd())
✔ Setting active project to 'D:/桌面/ReproduceRcpp2doParallel'
✔ Creating 'R/'
✔ Writing 'DESCRIPTION'
Package: ReproduceRcpp2doParallel
Title: What the Package Does (One Line, Title Case)
Version: 0.0.0.9000
Authors@R (parsed):
    * First Last <first.last@example.com> [aut, cre] (YOUR-ORCID-ID)
Description: What the package does (one paragraph).
License: `use_mit_license()`, `use_gpl3_license()` or friends to
    pick a license
Encoding: UTF-8
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.2.3
✔ Writing 'NAMESPACE'
Overwrite pre-existing file 'ReproduceRcpp2doParallel.Rproj'?

1: No
2: Yeah
3: Not now

Selection: 2
✔ Writing 'ReproduceRcpp2doParallel.Rproj'
✔ Adding '^ReproduceRcpp2doParallel\\.Rproj$' to '.Rbuildignore'
✔ Adding '^\\.Rproj\\.user$' to '.Rbuildignore'
✔ Opening 'D:/桌面/ReproduceRcpp2doParallel/' in new RStudio session
✔ Setting active project to '<no active project>'

 注意,“√”表示这个语句完成了哪些具体的工作,"●"表示需要我们手动操作的内容。(当然,上述创建R包的语句中没有●);

上述代码中问道:是否重写ReproduceRcpp2doParallel.Rproj?选择yeah,即重写这个项目文件,对原来的项目文件进行覆盖。注意:这里每次的选项顺序不一样,要根据意思进行选择,而不是根据编号进行选择!

2.2在RStudio通过菜单来创建一个新包

 直接在RStudio中建立新项目New Project. 其操作为New Project --> New Directory --> R package --> print R package name --> create Project.

图1-2

 

2.3关于R包创建的说明

不管是使用RStudio的菜单栏还是使用R函数,得到的结果都是一样的:一个最小的可用包,它由以下三个部分组成:

  1. 一个R/目录;
  2. 一个描述文件DESCRIPTION;
  3. 一个命名空间文件NAMSESPACE。

这个包还包括一个RStudio项目文件ReproduceRcpp2doParallel.Rproj,这将使你的包易于在RStudio中使用。

一些解释性的内容,其中:

  • DESCRIPTION文件:描述了你的包需要依赖什么来工作,如果要分享你的包,也会用DESCRIPTION文件来描述它的功能,谁可以使用它(许可证),以及如果包出现了问题该和谁联系。是关于R包的元数据。
  • NAMESPACE命名空间文件:为了和其他的包很好地协作,你的包需要定义它可以输出什么函数供其他包使用,以及它需要使用其他包的什么函数,这是NAMESPACE文件的工作,通过roxygen2来生成它。(roxygen最初从2008年的Google编程夏令营中诞生,作用是用来写帮助文档,可以在一个R文件中上面部分敲文档,下面部分敲代码,不需要在两个文件中切来切去,这让码农从重复劳动和技术细节中解放出来专心写代码。)
  • R/目录:里面存放构成这个包的R文件,实际上R包就是将一堆R自定义函数打包在一起,所以R/目录这个文件夹中存放的是一堆R自定义函数,一个自定义函数一个R文件。
  • .gitignore和.Rbuildignore:包含Git或者R包构建应该忽略的文件

至此,初步的开发R包的框架已经搭建完成,并且已经与远程仓库(Github)建立连接,后续任何更新都可以很容易地提交到Github仓库(提交步骤:Staged --> Commit --> Push)。

 3-添加R自定义函数

此时R/目录文件夹是空的,需要我们在里面添加一些自定义函数。

use_r("mean_parallel_compute")

 由于这里是复现Rcpp2doParallel包,所以ReproduceRcpp2doParallel这个包里的所有函数,都来自于Rcpp2doParallel.

通过rdrr.io 或者GitHub 可以找到Rcpp2doParallel包自定义R函数,如mean_parallel_compute.R,函数如下:

#' Call an Rcpp function within a doParallel call
#'
#' Constructs an example showing how to use `foreach`, `iterators`, and
#' `doParallel` to perform a parallel computation with a C++ function written
#' using Rcpp.
#'
#' @param n       Number of Observations
#' @param mean    Center of Normal Distribution
#' @param sd      Standard Deviation of Normal Distribution
#' @param n_sim   Number of Simulations to Run
#' @param n_cores Number of CPU cores to use in parallelization task.
#'
#' @return
#' A `vector` of length `n_sim` containing the mean for each distribution.
#'
#' @export
#'
#' @importFrom foreach %dopar% foreach
#' @importFrom iterators icount
#' @importFrom doParallel registerDoParallel
#' @importFrom stats rnorm
#'
#' @details
#' The `mean_parallel_compute()` function performs a bootstrap computation in
#' parallel of a mean value from the normal distribution.
#'
#' @examples
#' # Compute the mean on 1000 observations with 50 replications across
#' # 2 CPUs.
#' mean_parallel_compute(1000, n_sim = 50, n_cores = 2)
mean_parallel_compute = function(n, mean = 0, sd = 1,
                                 n_sim = 1000,
                                 n_cores = parallel::detectCores()) {

  # Construct cluster
  cl = parallel::makeCluster(n_cores)

  # After the function is run, close the cluster.
  on.exit(parallel::stopCluster(cl))

  # Register parallel backend
  doParallel::registerDoParallel(cl)


  # Compute estimates
  estimates = foreach::foreach(i = iterators::icount(n_sim), # Perform n simulations
                               .combine = "rbind",           # Combine results
                                                             # Self-load
                               .packages = "Rcpp2doParallel") %dopar% {
    random_data = rnorm(n, mean, sd)

    result = mean_rcpp(random_data) # or use Rcpp2doParallel::mean_rcpp()

    result
  }

  estimates
}

可以看到这个R文件分成上下两个部分,上面是关于文档说明的部分,之后会来制作帮助页面,下面部分是代码部分。通常,首先我们在通过use_r("R文件名字")中敲完代码,之后将鼠标放在函数体内,在RStudio中找到code--> Insert Roxygen Skeleton,便自动插入函数注释信息模板。(注意,一定要把光标放在函数体内,否则会弹出报错提示信息,告知要把光标放在函数体内。)

第一步:我们只粘贴上面的代码部分

 第二步:函数的注释部分通过code-->Insert Roxygen Skeleton来填充。得到下图,接着对照Rcpp2doParallel包中mean_parallel_compute自定义R函数文件,将其注释信息补充到我们当前打开的R文件中。

自动插入的函数注释信息为:@param、@return、@export、@ examples,其中@param后的参数是自动识别的,剩下的内容需要自己手动补充,就好像是按照要求填写表格。子弟哦那个插入函数的注释信息只出现在该R文件的函数上面,不会变动函数部分,换句话说,这样R文件被分成了两部分,上部分是函数注释信息,下部分是自定义R函数。其中函数注释信息,每行注释都以 #' 开头,@引导的关键词包括标题、描述、参数、返回值、工作示例,我们在这些关键词后面分别填写相应的内容。

@export表示导出该函数,这样做文档化时,会自动将这个函数添加到NAMESPACE文件。导出函数后,安装该包可以使用该函数,如果不添加@export,则不导出函数,这样的函数叫作内部函数,只供包里的其他函数使用。 

有了上述帮助信息,就可以执行文档化,代码如下,这样将自动生成函数帮助,实际上是调用roxygen2包生成man/function_name.Rd,该文件在RStudio Help窗口显示就如同我们平时使用“?函数名”查看帮助文件所看到的一样。

 @importFrom  package_name  function 表示从什么包 导入 哪个函数,也就是说,我们下面的这个自定义函数,用到了哪些包中的哪个函数,这个需要一一的通过@importFrom列出来。

@importFrom stats rnorm:从stats包导入函数rnorm函数。

@importFrom foreach %dopar% foreach:从foreach包导入两个函数:%dopar%和foreach(是函数)。

当包打包完成并在本地RStudio中加载过后,通过?mean_parallel_compute,得到下面的效果。

​ 

(不知道是不是文章太长了,导致保存的时候,经常会出现问题,接下来的内容以及参考放在新的文章中。)

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

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

相关文章

牛客复盘] 2023河南萌新联赛第(七)场:信息工程大学 B\I 20230823

牛客复盘] 2023河南萌新联赛第&#xff08;七&#xff09;场&#xff1a;信息工程大学 B\I 20230823 总结B 七夕1. 题目描述2. 思路分析3. 代码实现 I 细胞分裂1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 场外OB做了B和I题&#xff0c;只能说这场有点离谱。B 并查…

律师事务所微信小程序开发方案:实现智能化服务与用户体验的完美结合

随着移动互联网的快速发展&#xff0c;微信成为了人们日常生活中不可或缺的社交工具。为了满足用户对便捷、高效法律服务的需求&#xff0c;律师事务所微信小程序应运而生。本文将探讨律师事务所微信小程序的开发方案&#xff0c;旨在为读者提供一个专业、思考深度和逻辑性的指…

黑客自学笔记

谈起黑客&#xff0c;可能各位都会想到&#xff1a;盗号&#xff0c;其实不尽然&#xff1b;黑客是一群喜爱研究技术的群体&#xff0c;在黑客圈中&#xff0c;一般分为三大圈&#xff1a;娱乐圈 技术圈 职业圈。 娱乐圈&#xff1a;主要是初中生和高中生较多&#xff0c;玩网恋…

【RHEL】硬盘分区与格式化

fdisk命令 在linux中&#xff0c;fdisk是基于菜单的命令。对硬盘分区时&#xff0c;可以在fdisk命令后面直接加上要分区的硬盘作为参数(分区工具) 利用如下所示命令&#xff0c;打开fdisk操作菜单。 输入p,查看当前分区表。从命令执行结果可以到&#xff0c;/dev/mapper/rhel…

网络拓扑结构

目录 1.网络拓扑结构 1.星型拓扑结构 2.网型拓扑结构 3. 数制介绍 3.1 数制的基本概念 1.网络拓扑结构 网络拓扑结构是指用传输媒体互连各种设备的物理布局&#xff0c;也就是用什么方式连接网络中的计算机、网络设备&#xff0c;它的结构有星型拓扑&#xff0c;总线型拓扑…

JVM 之 垃圾收集算法详解

文章目录 一、标记清楚算法二、标记复制算法三、标记整理算法四、不同垃圾收集算法优缺点总结1. 标记-清除算法&#xff1a;2. 标记-复制算法&#xff1a;3. 标记-整理算法&#xff1a; 一、标记清楚算法 标记清除是一种简单而直接的垃圾回收算法。它的执行流程如下&#xff1…

【Rust】Rust学习 第十九章高级特征

现在我们已经学习了 Rust 编程语言中最常用的部分。在第二十章开始另一个新项目之前&#xff0c;让我们聊聊一些总有一天你会遇上的部分内容。你可以将本章作为不经意间遇到未知的内容时的参考。本章将要学习的功能在一些非常特定的场景下很有用处。虽然很少会碰到它们&#xf…

SpringBoot案例-文件上传

目录 简介 文件上传前端页面三要素 服务端接收文件 小结 本地储存 实现 代码优化 小结 阿里云OSS 阿里云 阿里云OSS 使用第三方服务--通用思路 准备工作 参照官方SDK代码&#xff0c;编写入门程序 集成使用 阿里云OSS-使用步骤 阿里云OSS使用步骤 参照SDK编写入…

【QT5-自我学习-线程qThread练习-两种使用方式-2:通过继承Qobject类-自己实现功能函数方式-基础样例】

【QT5-自我学习-线程qThread练习-两种使用方式-2&#xff1a;通过继承Qobject类-自己实现功能函数方式-基础样例】 1、前言2、实验环境3-1、学习链接-参考文章3-2、先前了解-自我总结&#xff08;1&#xff09;线程处理逻辑事件&#xff0c;不能带有主窗口的事件&#xff08;2&…

攻防世界-base÷4

原题 解题思路 base644&#xff0c;莫不是base16&#xff0c;base16解码网站&#xff1a; 千千秀字

k8s 安装istio (一)

前置条件 已经完成 K8S安装过程十&#xff1a;Kubernetes CNI插件与CoreDNS服务部署 部署 istio 服务网格与 Ingress 服务用到了 helm 与 kubectl 这两个命令行工具&#xff0c;这个命令行工具依赖 ~/.kube/config 这个配置文件&#xff0c;目前只在 kubernetes master 节点中…

postgres数据常用SQL语句

-- 系统信息函数 select version(),user,current_user; -- 创建表 CREATE TABLE biao(id INT primary key,name VARCHAR(25) not null,sex VARCHAR(25) unique,salary FLOAT default 9000 ); -- 更换表名 ALTER TABLE biaoRename to biao1; -- 更换字段类型 ALTER TABLE biao1 …

Tushare入门小册

Tushare入门小册 一、Tushare平台介绍 Pro版数据更稳定质量更好了&#xff0c;我们提供的不再是直接从互联网抓取&#xff0c;而是通过社区的采集和整理存入数据库经过质量控制后再提供给用户。但Pro依然是个开放的&#xff0c;免费的平台&#xff0c;不带任何商业性质和目的…

红黑树的调整图解

讲的很好 的红黑树原理 上面的视频讲解的红黑树很好。尤其是关于红黑树的调整。画图做了下总结&#xff0c;谢谢。

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

微服务中间件--统一网关Gateway

统一网关Gateway 8.统一网关Gatewaya.搭建网关服务b.路由断言工厂c.路由过滤器GatewayFilterd.全局过滤器GlobalFiltere.过滤器的执行顺序f.网关的cors跨域配置 8.统一网关Gateway 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在Spr…

基于大数据+django+mysql的银行信用卡用户的数仓系统

系统阐述的是银行信用卡用户的数仓系统的设计与实现&#xff0c;对于Python、B/S结构、MySql进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了 django框架和MySql数据库技术搭建系统的整体架构…

国民新旅游时代拉开大幕,OTA平台迎来新红利和新任务

高温轮番而至&#xff0c;这个燥热的夏天&#xff0c;旅游业也躁动不已。 上半年是旅游业丰收的半年&#xff0c;各地旅游盛况频上热搜。文旅部公布的旅游数据显示&#xff0c;2023年上半年&#xff0c;国内旅游总人次23.84亿&#xff0c;同比增长63.9%&#xff1b;国内旅游收…

IO day 7

1、使用消息队列完成两个进程间相互通信 msgsnd #include <myhead.h>typedef struct {long msgtype;char data[1024]; }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long)int main(int argc, const char *argv[]) {//创建key值key_t key;if((key ftok("/",k…

Feign:使用接口方式调用服务

创建一个新的消费者模块并导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://ma…