利用Rcpp将c++代码开发为R包 保姆级教程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

Rcpp包是一个打通R语言和C++语言的通信组件包,可以把C++代码与R程序连接在一起,且不用关心C++中那套繁琐的编译、链接、接口问题。R语言和C++语言的数据类型是不尽相同,通过Rcpp包能够对它们进行完整的映射转换。Rcpp支持把C++代码写在R源程序文件内, 执行时自动编译连接调用; 也支持把C++代码保存在单独的源文件中, 执行R程序时自动编译连接调用。其最大的用途之一在于提高运行效率,可以把R代码中遇到运行速度瓶颈部分改写成C++代码。另外,C++或C提供了各种方便使用的函数库,Rcpp可支持这些外来函数库的调用。(来源于https://blog.csdn.net/EPIPHANYECHO/article/details/128177806)


提示:以下是本篇文章正文内容,仅供参考

一、创建项目

首先进入RStudio,然后选择左上角的File—New Project,新建Project后会得到如下图所示的界面,接着选New Directory。
在这里插入图片描述
再选择R Package,在Type里面选择“Package w/Rcpp”,在Package Name中输入要创建的Rcpp包的名称,然后再在下面选择Add,将的.cpp格式的C++文件选择进去(里面是函数)。最后点击Create package,即可创建一个R包的project。
在这里插入图片描述

二、部分文件准备

1.解决NAMESPACE文件空白的问题

在创建Rcpp包的过程中,经常遇到NAMESPCE文件为空的问题,不妨先进行以下操作避免这个问题。
在R文件夹下新建一个r文件,copy以下内容可以解决document()生成NAMESPACE为空的问题。

#' @useDynLib YourPackageName
#' @importFrom Rcpp evalCpp
#' @exportPattern "^[[:alpha:]]+"
NULL

## usethis namespace: start
#' @useDynLib YourPackageName, .registration = TRUE
## usethis namespace: end
NULL

## usethis namespace: start
#' @importFrom Rcpp sourceCpp
## usethis namespace: end
NULL

2.Description文档检查修改

在该文档的最后一行加上非常重要的内容:

Imports: Rcpp (>= 1.0.10)
LinkingTo: Rcpp,RcppArmadillo

你的.cpp文件中可能不只有c++代码,还会用到其他的R包,比如我用到了Rcpp和RcppArmadillo,所以要LinkingTo到这些包。

3.生成函数的Help文档

打开R文件夹的r文件,光标放在函数名称前,shift+ctrl+Alt+R,生成help文档模板,填补模板(当有多个函数时,每一个函数都要有help文档,不能只添加其中一个函数的help文档),我的Help文档如下:

#' Calculate the Gaussian Weight and export the result in the form of vector
#'
#' @param distv a vector
#' @param obstv a vector
#' @param regtv a number, int
#' @param bw a number, int or float
#'
#' @return a vector
#' @export gau_wt_ad

我删除了@examples一行,因为自用,写得很简单,也不需要example进行说明。

三、创建

#先安装和载入用到的三个包,分别是:usethis,roxygen2,devtools
library(usethis)
library(roxygen2)
library(devtools)
has_devel()

#在描述文件中添加对MIT许可证的引用
#要使用其他许可证,请将这一行替换为usethis::use_gpl3_license(name = "My Name"),或者按照其他许可证的说明操作
usethis::use_mit_license()

#生成新的NAMESPACE和.Rd文件
devtools::document()

#检查各种相关配置
Rcpp::compileAttributes("C:/Users/27934/Documents/GWweight")

#检查是否有错误
devtools::check()

#打包安装
build()
Sys.setenv(R_INSTALL_STAGED = FALSE)
install(".")

总结

在创建Rcpp包的过程中,可能会出现很多错误,需要多次重复才能成功。以上过程为我成功创建Rcpp包的流程,有其他错误的话需要有针对性的去解决,推荐去Stack Overflow了解他人的解决经验。
另外,整理了以下我参考到的内容进行分享。
1.https://zhuanlan.zhihu.com/p/442412744?utm_id=0
2.https://zhuanlan.zhihu.com/p/527549223
3.https://teuder.github.io/rcpp4everyone_en/
4.https://blog.csdn.net/qq_42830713/article/details/127290868
5.https://blog.csdn.net/qq_42631514/article/details/120715764
6.https://blog.csdn.net/qq_43210428/article/details/125292029
7.https://blog.csdn.net/u010637238/article/details/83902212
8.https://xuzhougeng.top/archives/C++_For_R_User
9.https://zhuanlan.zhihu.com/p/500834064
10.https://blog.csdn.net/EPIPHANYECHO/article/details/128177806
11.https://blog.csdn.net/weixin_41929524/article/details/82260929
12.https://cloud.tencent.com/developer/article/1800279
13.https://blog.csdn.net/iamsuperman2/article/details/73251928?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-73251928-blog-81975484.235%5Ev27%5Epc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-73251928-blog-81975484.235%5Ev27%5Epc_relevant_default&utm_relevant_index=2

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村姑小张

我会继续认真清楚的写博客滴~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值