【问题标题】:Function param default value std:vector initialization with Rcpp and C++11?函数参数默认值 std:vector 初始化与 Rcpp 和 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 声明

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

【问题讨论】:

    标签: r c++11 rcpp


    【解决方案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
    猜你喜欢
    • 2014-07-25
    • 2020-02-08
    • 2015-02-25
    • 2017-11-19
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2014-05-06
    • 2016-03-27
    相关资源
    最近更新 更多