问题 Rcpp - 在sourceCpp引用的文件中使用多个C ++函数?


我希望这不是太明显,因为我整天搜索都找不到答案。

说我有以下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() 内 giveOutput(), 我能做什么?


5802
2018-02-02 23:41


起源



答案:


你应该使用 导出属性 在您想要导出的每个功能的前面。所以通过纠正你的文件

#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()...


14
2018-02-03 00:00



哦,这很明显:)谢谢!顺便说一句精彩的套餐,我很高兴放弃C. - Patrick McCarthy
好吧,也许它不是那么明显。这是我正在尝试实现的文件: pastebin.com/bP4kGLs2  inclusprobabilitiesCpp被识别并编译,但是UPtilleCpp没有,并且在编译之后,l中的ls()只显示前者。他们变长的时候有诀窍吗? - Patrick McCarthy
确认 - 我们的两台机器也失败了。我们将仔细研究一下。 - Dirk Eddelbuettel
看起来像你的 //** 被解析器误解了。这是我们这边的一个错误(被误解为块评论的开头),但你可以避免它...通过“更标准”的评论,如普通的老 // 甚至 // ** 有空间。 - Dirk Eddelbuettel
JJ说这已经在SVN修订版4242中得到修复。感谢错误报告! - Dirk Eddelbuettel


答案:


你应该使用 导出属性 在您想要导出的每个功能的前面。所以通过纠正你的文件

#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()...


14
2018-02-03 00:00



哦,这很明显:)谢谢!顺便说一句精彩的套餐,我很高兴放弃C. - Patrick McCarthy
好吧,也许它不是那么明显。这是我正在尝试实现的文件: pastebin.com/bP4kGLs2  inclusprobabilitiesCpp被识别并编译,但是UPtilleCpp没有,并且在编译之后,l中的ls()只显示前者。他们变长的时候有诀窍吗? - Patrick McCarthy
确认 - 我们的两台机器也失败了。我们将仔细研究一下。 - Dirk Eddelbuettel
看起来像你的 //** 被解析器误解了。这是我们这边的一个错误(被误解为块评论的开头),但你可以避免它...通过“更标准”的评论,如普通的老 // 甚至 // ** 有空间。 - Dirk Eddelbuettel
JJ说这已经在SVN修订版4242中得到修复。感谢错误报告! - Dirk Eddelbuettel