11

我希望这不是太明显,因为我已经搜索了一整天并且找不到答案。

假设我有以下 R 文件:

library(Rcpp)
sourceCpp("cfile.cpp")

giveOutput(c(1,2,3))

它编译以下 C++ 文件:

#include <Rcpp>
using namespace Rcpp;
// [[Rcpp::export]]

NumericVector plusTwo(NumericVector x){
  NumericVector out = x + 2.0;

  return out;
}

NumericVector giveOutput(NumericVector a){

NumericVector b = plusTwo(a);
return b;
}

无论我尝试什么,Rcpp 预处理器都plusTwo()可用,giveOutput()但根本不可用。我能够找到的文档说这是一个应该创建一个包的点,但是在阅读包小插图之后,它似乎比我需要的要复杂一个数量级。

没有明确定义plusTwo()inside giveOutput(),我能做什么?

4

1 回答 1

15

您应该在要导出的每个函数前使用export 属性。因此,通过将文件更正为

#include <Rcpp.h>

using namespace Rcpp;

// [[Rcpp::export]]
NumericVector plusTwo(NumericVector x){
  NumericVector out = x + 2.0;
  return out;
}

// [[Rcpp::export]]
NumericVector giveOutput(NumericVector a){
  NumericVector b = plusTwo(a);
  return b;
}

我得到了想要的行为:

R> sourceCpp("/tmp/patrick.cpp")
R> giveOutput(1:3)
[1] 3 4 5
R> plusTwo(1:3)
[1] 3 4 5
R> 

哦,创建一个包就像调用一样简单Rcpp.package.skeleton()(但请阅读它的帮助页面,特别是关于attributes参数的)。我知道至少有一个 CRAN 包,它开始了你从这里开始的方式,并且显然是通过Rcpp.package.skeleton()...

于 2013-02-03T00:00:20.717 回答