Yulong Niu

个人博客

创建R包的最简流程

Posted at — Mar 27, 2014

一个最简单创建R包的流程。

1. 载入工具包

安装并载入devtools包和roxygen2包。devtools包提供了一些包的检查、安装和打包的基本工具。roxygen2包则使得书写R帮助文档变得轻松简单。如果习惯使用Emacs,可以结合ESS建立R包,可以将R代码和帮助文档有效组合在一起,便于管理。当然,也可以使用Rstudio

library('devtools')
library('roxygen2')

2. Rcpp和相关的包

如果使用了Rcpp或者相关的包,比如RcppArmadillo,需要格外设置。所有cpp代码都写在src文件夹下。

首先,执行:

use_rcpp()

其次,在DESCRIPTION中添加依赖或者需要链接的包名称,比如:

Encoding: UTF-8
Imports:
    Rcpp
LinkingTo:
    Rcpp,
    RcppArmadillo

之后,在包的R/目录下,添加一个文件RcppChk.R(文件名称自定),并写入:

#' @useDynLib my-pkg-name, .registration = TRUE
#' @importFrom Rcpp sourceCpp
NULL

注意,修改my-pkg-name为自己的包名称。

然后,在包的src/目录下,添加一个文件registerDynamicSymbol.c(文件名称自定),并写入:

// RegisteringDynamic Symbols

#include <R.h>
#include <Rinternals.h>
#include <R_ext/Rdynload.h>

void R_init_markovchain(DllInfo* info) {
  R_registerRoutines(info, NULL, NULL, NULL, NULL);
  R_useDynamicSymbols(info, TRUE);
}

最后,可能需要在~/.R/Makevars文件下添加:

# Settings from /etc/R/Makeconf with "non-portable flag(s):"
# ‘-Wdate-time’ ‘-Werror=format-security’ ‘-Wformat’ replaced by -Wall -pedantic
# and without -fdebug-prefix-map=...
CFLAGS = -g -O2 -Wall -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2 $(LTO)
CXXFLAGS = -g -O2 -Wall -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2 $(LTO)
CXX98FLAGS = -g -O2 -Wall -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2
CXX11FLAGS = -g -O2 -Wall -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2
CXX14FLAGS = -g -O2 -Wall -pedantic -fstack-protector-strong -D_FORTIFY_SOURCE=2

3. 创建DESCRIPTION文件模板

load_all()

其中import栏目,在源代码中使用了哪些包,需要逐步在import项目中添加和修改。

4. 更新文档和检查包

document()
check()

## 跨平台check
rhub::check_on_windows()

5. 安装包

install()

6. 生成.tar.gz压缩文件

build()

7. 补充

7.1 生成Windows binary包

$ R CMD build MyPkg
$ R CMD check MyPkg.tar.gz

检查通过后,Building and checking R source packages for Windows.手动上传MyPkg.tar.gz

或者

devtools::check_win_release()

参考网址

更新记录

2023年06月05日