函数参数默认值 std:vector 初始化与 Rcpp 和 C++11?

Posted

技术标签:

【中文标题】函数参数默认值 std:vector 初始化与 Rcpp 和 C++11?【英文标题】:Function param default value std:vector initialization with Rcpp and C++11? 【发布时间】:2014-10-08 18:03:41 【问题描述】:

我正在尝试编写一个具有可选参数的 C++/Rcpp 函数,该参数的默认值需要是长度为 1 且值为 0 的向量。以下无法正确编译:

cppFunction("std::vector<int> test(std::vector<int> out = 0) 
  return out;
")

我收到以下错误:

cppFunction 中的错误(“std::vector 测试(std::vector out = 1) \n return out;\n") : 未找到函数定义 另外:警告消息:1:没有找到 Rcpp::export 的函数 fileee5f629605d7.cpp:5 2 处的属性:在 sourceCpp(代码 = 代码,环境 = env, rebuild =rebuild, showOutput = showOutput, : 在源代码中找不到 Rcpp::export 属性或 RCPP_MODULE 声明

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

此答案已发布在 Rcpp 问题跟踪器上。这是我想要的结果,而不是 std::vector。

cppFunction("IntegerVector test(IntegerVector out = IntegerVector::create(0)) 
   return out;
")

【讨论】:

您可以简单地进行转换,以便将创建为Rcpp::IntegerVector 的内容返回为std::vector&lt;int&gt;。 Rcpp 会自动为您进行转换。 嗯,我首先使用 std::vector 的唯一原因是因为在函数内部我需要增长/填充该向量以匹配另一个向量的长度。 IntegerVector 是否与 resize() 等效?编辑:我会投票赞成这个答案,但我提供了它。 在此处和 rcpp-devel 列表中已多次讨论过使用哪种向量类型。【参考方案2】:

您可以将底层 C++ 函数包装在使用默认值的 R 函数中:

#include <Rcpp.h>
#include <vector>
// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]
std::vector<int> cpp_test(const std::vector<int>& x)

  return x;


/*** R

test <- function(X = c(0L))

  cpp_test(X)


test()

test(c(1:5))

*/

给你

> Rcpp::sourceCpp('~/RcppFiles/cpp_test.cpp')
> test()
[1] 0

> test(c(1:5))
[1] 1 2 3 4 5

【讨论】:

这是我以前做的。但是,compileAttributes() 会丢弃在 RcppExports.R 中所做的任何更改。我试图只维护一个文件(cpp 文件)。 只需使用第二个 R 文件。调用您的自动生成的foo_impl() 并让foo() 调用foo_impl() 使用此处显示的技巧。 好吧,如果它“糟透了”,那么 Rcpp 可能不适合你。对不起。并非所有事情都可以在一个文件解决方案中完成,并且正如您在 GitHub 上提供的(尽管每个人都知道交叉发布更糟糕),我跟进了那里。您的示例不起作用。 别把话放在我嘴里,“糟透了”是你的话,不是我的 在这里堆积选项而不是无用的词汇战;我计划扩展如何在attributes 包中提供默认值,它与 Rcpp 和其他 R/C++ 实现兼容。 github.com/Rcpp11/attributes/issues/36【参考方案3】:

目前Rcpp 包不支持导出默认值。有几个包可以改进这个(包括Rcpp11),我想,我在RcppRCPP_MODULES 上有一个解决方案:

library("Rcpp")

cppFunction(plugins=c("cpp11"),'NumericVector test(std::vector<int> out) 
  return wrap(out);


RCPP_MODULE(mod) 
  function("test",&test,List::create( _["out"] = std::vector<int>(0)), "Simple description");
', verbose=TRUE,rebuild=TRUE)

我改变了返回类型,我想,即使你返回std::vector&lt;int&gt;,它也能工作。

那么,这是如何工作的:它只是创建一个具有默认值的文档条目,RCPP_MODULES 的第三个参数。

只有0 我的R 崩溃,所以我有必要明确输入std::vector

【讨论】:

实际上,Rcpp 确实导出了默认值。它似乎不适用于原始类型。 Rcpp所做的是将=的rhs转换为R代码。它只知道如何处理某些事情。我正在尝试另一种方法来使用属性包中的 R 代码设置 R 函数的形式。 github.com/Rcpp11/attributes/issues/36

以上是关于函数参数默认值 std:vector 初始化与 Rcpp 和 C++11?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?

默认容器参数

C++中,为啥函数参数不够也可以调用?而且函数模板定义中没有提供默认值。

具有两个输入参数的 std::vector 构造函数[重复]

如何默认初始化 std::vector

c++ 用新类初始化二维向量;默认值更改