9

这里发生了两件事:(1)我只是在学习如何使用 Rcpp 和朋友让我的 R 代码更快,(2)我以前从未构建过 R 包。

我已经使用了inline下来。很棒的包裹。爱它。但是,我似乎无法使用使用inlinewith开发的任何代码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"

它失败。在我未经训练的眼睛看来:

  1. 编译的代码inline从未被 *.package.skeleton 复制到目录骨架的“右侧”部分,以供 R 构建过程稍后编译,并且
  2. 如果 'code_files' 参数不会导致 R 在加载包时获取这些 *.R 文件,则失败。

进一步考虑这一点,似乎(2)将是一个非常糟糕的主意,因为它会强制用户每次加载他们的包时编译代码。这将排除所有只需要二进制包的用户,而且效率很低。

并且 (1) 在技术上似乎是可行的,但正如Rcpp 邮件列表中所讨论的那样,不值得实现一组自动魔术转换器功能。

所以,问题:

有人可以介绍一下获取提供的示例代码并将其转换为 R 包的正确方法吗?

对我来说,理解现有文档有点新鲜。FWIW,我相信这对未来的人们会有帮助!

4

1 回答 1

10

第 1 步:编写一个没有 Rcpp 的虚拟包,只是为了感受一下事情是如何工作的

第 2 步:阅读 Dirk关于如何制作使用 Rcpp 的包的说明。

从我读过的内容inline来看,似乎使包中的 Rcpp 变得更难而不是更容易。

于 2012-07-12T17:16:10.990 回答