这里发生了两件事:(1)我只是在学习如何使用 Rcpp 和朋友让我的 R 代码更快,(2)我以前从未构建过 R 包。
我已经使用了inline
下来。很棒的包裹。爱它。但是,我似乎无法使用使用inline
with开发的任何代码package.skeleton
来制作 R 包。
这是一个最小的例子:
第 1 步:制作 R 脚本
#############################
# File : build-R-pacakge.R #
#############################
require(inline)
require(Rcpp)
require(RcppArmadillo)
# Define a simple cxxfunction
plus.two.cpp.src <- '
arma::mat U = Rcpp::as<arma::mat>(UmatrixR);
return(Rcpp::wrap(U+2));
'
plus.two.cpp <- cxxfunction(
signature(UmatrixR="numeric"),
body=plus.two.cpp.src,
plugin="RcppArmadillo")
# Define the analogous R function
plus.two.r <- function( x ) {
return( x + 2 )
}
第 2 步:将其构建为 R 包
在新的 R 会话中运行:
source('build-R-package.R')
RcppArmadillo.package.skeleton(name='inlineExample',
list=c('plus.two.cpp', 'plus.two.r'),
code_files='build-R-package.R')
然后删除man/*.Rd
文件,因为 R 没有设置“正常工作”的默认值。
$ rm inlineExample/man/*.Rd
并运行:
$ R CMD build inlineExample/
<< snip >>
$ R CMD check inlineExample_1.0.tar.gz
<< snip >>
$ R CMD INSTALL inlineExample_1.0.tar.gz
<< snip >>
除了一些抱怨缺少文档外,所有这些都成功完成。
第 3 步:尝试一下
然后在新的 R 会话中尝试一下:
> require(inlineExample)
Loading required package: inlineExample
Loading required package: Rcpp
Loading required package: RcppArmadillo
Loading required package: inline
>
> plus.two.cpp( matrix(1:12, ncol=3))
Error in .Primitive(".Call")(<pointer: (nil)>, UmatrixR) :
NULL value passed as symbol address
>
> plus.two.cpp
An object of class "CFunc"
function (UmatrixR)
.Primitive(".Call")(<pointer: (nil)>, UmatrixR)
<environment: 0x2f28370>
Slot "code":
[1] "\n// includes from the plugin\n#include <RcppArmadillo.h>\n#include <Rcpp.h>\n\n\n#ifndef BEGIN_RCPP\n#define BEGIN_RCPP\n#endif\n\n#ifndef END_RCPP\n#define END_RCPP\n#endif\n\nusing namespace Rcpp;\n\n\n// user includes\n\n\n// declarations\nextern \"C\" {\nSEXP file2f8c4cc10657( SEXP UmatrixR) ;\n}\n\n// definition\n\nSEXP file2f8c4cc10657( SEXP UmatrixR ){\nBEGIN_RCPP\n\n arma::mat U = Rcpp::as<arma::mat>(UmatrixR);\n return(Rcpp::wrap(U+2));\n\nEND_RCPP\n}\n\n\n"
它失败。在我未经训练的眼睛看来:
- 编译的代码
inline
从未被 *.package.skeleton 复制到目录骨架的“右侧”部分,以供 R 构建过程稍后编译,并且 - 如果 'code_files' 参数不会导致 R 在加载包时获取这些 *.R 文件,则失败。
进一步考虑这一点,似乎(2)将是一个非常糟糕的主意,因为它会强制用户每次加载他们的包时编译代码。这将排除所有只需要二进制包的用户,而且效率很低。
并且 (1) 在技术上似乎是可行的,但正如Rcpp 邮件列表中所讨论的那样,不值得实现一组自动魔术转换器功能。
所以,问题:
有人可以介绍一下获取提供的示例代码并将其转换为 R 包的正确方法吗?
对我来说,理解现有文档有点新鲜。FWIW,我相信这对未来的人们会有帮助!