创建R包-2.1:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)
目录
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包有两种形式:
- 通过R函数create_package来创建新包 ;(本文使用的是该种方法创建新包)
- 在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 topick 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 nowSelection: 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.
2.3关于R包创建的说明
不管是使用RStudio的菜单栏还是使用R函数,得到的结果都是一样的:一个最小的可用包,它由以下三个部分组成:
- 一个R/目录;
- 一个描述文件DESCRIPTION;
- 一个命名空间文件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 clustercl = parallel::makeCluster(n_cores)# After the function is run, close the cluster.on.exit(parallel::stopCluster(cl))# Register parallel backenddoParallel::registerDoParallel(cl)# Compute estimatesestimates = 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,得到下面的效果。
(不知道是不是文章太长了,导致保存的时候,经常会出现问题,接下来的内容以及参考放在新的文章中。)
相关文章:
创建R包-2.1:在RStudio中使用Rcpp制作R-Package(更新于2023.8.23)
目录 0-前言 1-在RStudio中创建R包项目 2-创建R包 2.1通过R函数创建新包 2.2在RStudio通过菜单来创建一个新包 2.3关于R包创建的说明 3-添加R自定义函数 4-添加C函数 0-前言 目标:在RStudio中创建一个R包,这个R包中包含C函数,接口是Rc…...
chatGPT如何解释泽众PerformanceRunner性能测试工具?
PerformanceRunner 是一个性能测试工具,可以帮助测试人员进行性能测试。它的主要功能包括: 1. 脚本录制和回放: PerformanceRunner可以录制 HTTP/HTTPS 通信协议的脚本,并能够回放模拟真实用户的行为。通过录制和回放,…...
LA@向量组线性相关性
文章目录 向量组线性相关性线性相关线性无关多向量向量组线性相关单向量向量组的线性相关性单位向量向量组线性相关性双向量向量组的线性相关性双向量线性相关的几何意义三向量线性相关的几何意义包含零向量的向量组线性相关概念迁移:线性方程组和线性相关齐次线性方程组和向量…...
[k8s] 基于ubuntu22部署k8s1.28记录
k8s1.28部署已经不依赖docker了,所以不需要安装docker。同理:如果想查看镜像和运行容器,也不能用docker命令去查询了:需要使用crictl。不过crictl命令参数兼容docker,所以使用上手没有啥难度。 1. 配置安装源 根据k8…...
React 事件代理 和原生事件绑定混用:你的选择会导致什么问题?
在React开发中,事件处理是一个常见的任务。React提供了一个方便的事件系统,但有时我们可能会在React组件中与原生DOM事件一起使用。本文将讨论React的事件代理机制与原生事件绑定混用可能导致的一些问题。 React的事件代理 React采用了一种称为"事…...
使用阿里云国外和国内云服务器有什么注意事项?
使用阿里云的国外和国内云服务器时,有一些注意事项需要考虑: 地理位置:选择离你的用户或数据中心最近的地理位置,可以减少延迟和提高访问速度。对于国内用户,使用国内云服务器可能更好;对于国外用户&#…...
【计算机网络】【常考问题总结】
1. ping 127.0.0.1 后会发生什么? ping 127.0.0.1 ;ping 0.0.0.0 ; ping localhost 面试官问:断网了,还能ping通 127.0.0.1 吗?为什么?_kevin_tech的博客-CSDN博客 2. MTU,MMU是…...
前端基础(props emit slot 父子组件间通信)
前言:如何实现组件的灵活使用,今天学习组件封装用到的props、slot和emit。 目录 props 子组件 父组件 示例代码 slot 示例代码 作用域插槽 emit 示例代码 props 需要实现在其他组件中使用同一个子组件。 子组件 子组件(所谓子组件…...
即时通讯:短轮询、长轮询、SSE 和 WebSocket 间的区别
在现代 Web 开发中,即时通讯已经成为许多应用程序的重要组成部分。为了实现即时通讯,开发人员通常使用不同的技术和协议。本文将介绍四种常见的即时通讯实现方法:短轮询、长轮询、SSE(服务器发送事件)和 WebSocket&…...
高忆管理:药店零售概念回落,开开实业走低,此前7日大涨超80%
药店零售概念18日盘中大幅下挫,到发稿,华人健康跌逾11%,漱玉布衣、塞力医疗跌超9%,重药控股、浙江震元、榜首医药等跌超7%,药易购跌超6%,开开实业跌超3%。 值得注意的是,开开实业此前7个交易日斩…...
Go1.19 排序算法设计实践 经典排序算法对比
详解经典排序算法 01 为什么要学习数据结构与算法 抖音直播排行榜功能 案例 规则:某个时间段内,直播间礼物数TOP10房间获得奖励,需要在每个房间展示排行榜解决方案 •礼物数量存储在Redis-zset中,使用skiplist使得元素整体有序 •…...
3:Ubuntu上配置QT交叉编译环境并编译QT程序到Jetson Orin Nano(ARM)
1.Ubuntu Qt 配置交叉编译环境 1.1 ubuntu 20.04安装Qt sudo apt-get install qtcreator 1.2 配置QT GCC配置同上 最后配置Kits 上面设置完成之后 ,设置Kits 中的Device(这是为了能够直接把项目部署到arm设备上) 点击NEXT之后会出现连接被拒绝,不用担…...
CentOS下MySQL的彻底卸载的几种方法
这里我为大家详细讲解下“CentOS下MySQL的彻底卸载的几种方法”的完整攻略。 前言 先通过下列命令找到需要删除的相关文件 rpm -qa mysql* whereis mysql find / -name mysql 需要上传的命令介绍 删除 MySQL 数据目录 rm -rf /var/lib/mysql 删除配置文件 rm -rf /etc/my.cnf…...
Spring 的异常处理机制
Spring 的异常处理机制 在Spring中,异常处理是一个非常重要的方面,用于捕获和处理应用程序中可能出现的异常情况。Spring提供了多种方式来处理异常。 使用Spring的异常处理机制主要有以下优点: **统一的异常处理:**通…...
java八股文面试[JVM]——JVM参数
参考:JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 堆参数调优入门 jdk1.7: jdk1.8: 面试题:给定-Xms Xmx -Xmn 问 最大的eden区域是多少M。 常用JVM参数 怎么对jvm进行调优?通过参数配…...
面试热题(复原ip地址)
有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.24…...
【JavaSE】Java方法的使用
【本节目标】 1. 掌握方法的定义以及使用 2. 掌握方法传参 3. 掌握方法重载 4. 掌握递归 目录 1.方法概念及使用 1.1什么是方法(method) 1.2 方法定义 1.3 方法调用的执行过程 1.4 实参和形参的关系 2. 方法重载 2.1 为什么需要方法重载 2.2 方法重载概念 3. 递归 3.…...
Node.js 安装和配置(完整详细版)
在Windows上安装和配置Node.js: 下载Node.js安装程序: 前往Node.js官方网站(https://nodejs.org/),在主页上找到"Downloads"(下载)选项。然后选择适用于Windows的"Windows Insta…...
剪枝基础与实战(4):稀疏训练及剪枝效果展示
稀疏训练是通过在损失loss中增加BN的 γ \gamma γ 参数的L1正则,从而让绝大多数通道对应的 γ \gamma γ值趋近与0, 从而使得模型达到稀疏化的效果:...
CentOS 7.6使用yum安装stress,源码安装stree-ng 0.15.06,源码安装sysstat 12.7.2
cat /etc/redhat-release看到操作系统的版本是CentOS Linux release 7.6.1810 (Core),uname -r可以看到内核版本是3.10.0-957.21.3.el7.x86_64 yum install stress sysstat -y安装stress和sysstat。 使用pidstat -u 5 1没有%wait项: 原因是CentOS 7仓…...
POI groupRow 折叠分组,折叠部分不显示问题
折叠组是什么?如图就是用POI 实现的,代码很简单:sheet.groupRow(开始行,结束行)即可 但是万万没想到,最终实现出的结果,合并的组,有一部分并没有渲染出来,如下图: 因为我…...
一、数据库基础
数据库 一、数据库基础 1、一些概念 数据库:数据库(DataBase ,简称DB),就是信息的集合。数据库是由数据库管理系统管理的数据的集合;数据库管理系统:简称DBMS 。是一种操纵和管理数据库的大型…...
Harmony OS教程学习笔记
基础知识 1.如何修改程序启动的第一个页面? 不想使用创建的默认的页面,这时需要修改启动页面,修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…...
605. 种花问题
链接 假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中…...
Elasticsearch 常见的简单查询
查看es中有哪些索引 请求方式:GET 请求地址:http://localhost:9200 /_cat/indices?v 参数:无 结果: 查看索引全部数据 请求方式:GET 请求地址:http://localhost:9200/index-2023-08/_search 参数&a…...
C#使用xamarin进行跨平台开发
使用 Xamarin 进行跨平台开发可以使用 C# 和 .NET 平台来开发移动应用程序,同时将代码在多个主要移动操作系统上运行,包括 Android 和 iOS。以下是在 C# 中使用 Xamarin 进行跨平台开发的一般步骤: 安装 Xamarin: 在开始之前&…...
xargs 的用法 在1个文件夹中批量删除文件,这些删除的文件名是另一个文件夹中的文件名。
xargs 的用法 在1个文件夹中批量删除文件,这些删除的文件名是另一个文件夹中的文件名。 1、问题背景 应用场景 1、问题背景 应用场景 在二进制部署docker时,会把docker的所有可执行文件复制到/usr/bin下。 如果说复制过去后,想要反悔&#x…...
集简云本周新增/更新:新增2大功能,集成2款应用,更新4款应用,新增近20个动作
本周更新概要 新增功能 新增功能:Claude2 新增功能:语聚AI对话助手对话背景设定 应用新增 新增应用:领星ERP 新增应用:slack(自建) 应用更新 更新应用:企业微信(代开发) 更新应用:阿里云效2020(新版…...
MySQL存储过程怎么写?看完这篇秒懂
今天测试一个数据展示模块,依赖于数据部推送数据,但是他们没有人员配合,为了赶工,于是自己徒手造数据,有些页面,要查看翻页和权限等相关的功能,手动造是不可能的,因为我懒....哈哈哈…...
STM32电源名词解释
STM32电源架构 常用名词 VCC Ccircuit 表示电路,即接入电路的电压。 VDD Ddevice 表示器件, 即器件内部的工作电压。 VSS Sseries 表示公共连接,通常指电路公共接地端电压。 VDDA Aanalog 表示模拟,是模拟电路部分的电源。主要为…...
南方科技大学网站建设/哪个浏览器不屏蔽网站
springboot validator 验证器 ********************** 相关类与接口 Validator:spring 提供接口,可对类进行验证 public interface Validator {boolean supports(Class<?> clazz); //验证的类void validate(Object target, Errors …...
网站首页面/关键词优化排名平台
本文转载2篇文章 文章一、 mysql-获取当前系统时间 文章二: MySQL 获得当前日期时间(以及时间的转换)。...
响应式网站制作视频/网站软件推荐
下面是部分代码预览: """ 大鱼吃小鱼简易版.py 作者曾于几年前编写过本程序,这个版本是全新制作的。 日期2019年6月11日,本程序导入了Bigfish类和fish类。 在播放背景音乐的同时,用鼠标去操作大鱼吃小鱼。 如果要让…...
国家企业网/深圳seo云哥
DNS(Domain Name System,域名系统),万维网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串 DNS系统:通过域名,…...
合肥公司门户网站制作/2018十大网络营销案例
Layui框架 中table解决日期格式问题参考文章: (1)Layui框架 中table解决日期格式问题 (2)https://www.cnblogs.com/Slacker-z/p/9963477.html 备忘一下。...
免费网络营销公司哪家好/白山seo
SQLPLUS环境参数 掌握help index、list、clear、column、host、show、run、change等命令的使用 要求每个命令执行一遍并记录过程 掌握单表where字句中条件的使用 掌握函数:trunc、lower、upper、trim、lpad、rpad、ltrim、rtrim、replace、substr、concat、length、…...