gpt4 book ai didi

c++ - 在模板化 Rcpp 函数中调用另一个 cpp 函数

转载 作者:行者123 更新时间:2023-12-04 18:55:11 26 4
gpt4 key购买 nike

我正在尝试在 Rcpp 中创建某种 sapply 函数,其工作原理如下:

  • apply_cpp_fun(x, fun, ...)函数有两个参数:任何类型的 vector x , 以及任何 cpp 函数 fun , 加上 fun 中所需的可选参数(例如 bool na_rm )。在示例中,我保持简单,只是 xfun .
  • 我要 fun应用于 x 的选定元素(可能的 fun 输出 - bool、int、double、string)。我不想申请在内部多次被调用 apply_cpp_fun .
  • apply_cpp_fun 的输出是依赖于 fun 的任何类型的 vector 输出(可以不同于 x )。 fun被称为 n 次,以产生输出 vector 的每个元素 res .

  • 我试图通过但每次输出变成 Rcpp::List 来实现这一点而不是 Rcpp::Vector<double> .

    这是一个代码,我没有写 apply_cpp_fun的全部内容保持示例更短。如您所见,即使我通过 <double>function , 模板获取 vector 描述为 double (*)(Rcpp::Vector<14, Rcpp::PreserveStorage>) .

      #include <Rcpp.h>

    double cpp_sum(Rcpp::NumericVector x) {
    int n = x.size();
    double cursum = 0;

    for (int i = 0; i < n; i++) {
    cursum += x(i);
    }

    return cursum;
    }

    template <int ITYPE, typename ftype>
    Rcpp::Vector<Rcpp::traits::r_sexptype_traits<ftype>::rtype>
    apply_cpp_fun(Rcpp::Vector<ITYPE>& x,
    ftype fun) {

    int n = x.size();
    double xx = 5.0;

    # typenames
    Rcpp::Rcout << "type of xx: " << demangle(typeid(xx).name()).c_str() << std::endl;
    Rcpp::Rcout << "function type: " << demangle(typeid(ftype).name()).c_str() << std::endl;
    const int OTYPE = Rcpp::traits::r_sexptype_traits<ftype>::rtype;
    Rcpp::Rcout << "SEXP type: " << OTYPE << std::endl;

    # apply fun n-times
    Rcpp::Vector<OTYPE> res(n);
    for (int i = 0; i < n; i++) {
    res(i) = fun(x);
    }

    return res; # return vector
    }

    // [[Rcpp::export]]
    SEXP cumsum_cpp(Rcpp::NumericVector x) {
    return apply_cpp_fun(x, cpp_sum);
    }


    调用函数查看结果

    cumsum_cpp(as.numeric(1:2))
    # type of xx: double
    # function type: double (*)(Rcpp::Vector<14, Rcpp::PreserveStorage>)
    # SEXP type: 19
    # [[1]]
    # NULL
    #
    # [[2]]
    # NULL



    如何解决此问题以保持应用程序对输入类型和输出的灵活性?
    感谢您的任何建议。

    最佳答案

    The documentation声明 r_sexptype_traits是一个

    template that returns the SEXP type that is appropriate for the type T, this is allways VECSXP (lists) unless it is specialized



    所以。它专门用于函数指针类型吗?就我所见,并不清楚特化会返回什么:您似乎希望它返回一个函数的返回类型——但这不是这个元函数所做的。相反,它执行 C++ 和 R SEXP 类型之间的映射(换句话说,来自 SEXPTYPES table 的映射)。

    正如 Ralf 在评论中指出的那样,您需要 std::result_of 或者,如果您使用的是 C++17, std::invoke_result :
    template <typename T>
    using RcppVec = Rcpp::Vector<Rcpp::traits::r_sexptype_traits<T>::rtype>;

    template <int ITYPE, typename FTYPE>
    auto apply_cpp_fun(Rcpp::Vector<ITYPE> const& x, FTYPE fun) ->
    RcppVec<typename std::result_of<FTYPE>::type>
    {

    }

    关于c++ - 在模板化 Rcpp 函数中调用另一个 cpp 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59594222/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com