gpt4 book ai didi

r - 在 Rcpp 中调用 R 函数

转载 作者:行者123 更新时间:2023-12-04 10:54:20 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Call a function from c++ via environment Rcpp

(1 个回答)


5年前关闭。




我试图在 Rcpp 中调用 sd(x),它是一个 R 函数。我看过一个在 Rcpp 中调用 R 函数 dbat(x) 的例子,它工作得很好。

// dens calls the pdf of beta distribution in R
//[[Rcpp::export]]
double dens(double x, double a, double b)
{
return R::dbeta(x,a,b,false);
}

但是当我厌倦了将这种方法应用于 sd(x) 如下时,它出错了。
// std calls the sd function in R
//[[Rcpp::export]]
double std(NumericVector x)
{
return R::sd(x);
}

有谁知道为什么这不起作用?

最佳答案

您的代码存在一些问题。

  • stdC++ Standard Library namespace有关
  • 这是触发:

    error: redefinition of 'std' as different kind of symbol

  • R::是处理 Rmath functions 的命名空间.其他 R函数将 不是 在这个范围内找到。
  • 要从 C++ 中直接调用 R 函数,您必须使用 Rcpp::EnvironmentRcpp::Function如示例中给出的 sd_r_cpp_call() .
  • 这种方法有很多问题,包括但不限于速度损失。
  • 最好使用Rcpp sugar表达式或实现您自己的方法。

  • 说了这么多,让我们来谈谈代码:
    #include <Rcpp.h>

    //' @title Accessing R's sd function from Rcpp
    // [[Rcpp::export]]
    double sd_r_cpp_call(const Rcpp::NumericVector& x){

    // Obtain environment containing function
    Rcpp::Environment base("package:stats");

    // Make function callable from C++
    Rcpp::Function sd_r = base["sd"];

    // Call the function and receive its list output
    Rcpp::NumericVector res = sd_r(Rcpp::_["x"] = x,
    Rcpp::_["na.rm"] = true); // example of additional param

    // Return test object in list structure
    return res[0];
    }


    // std calls the sd function in R
    //[[Rcpp::export]]
    double sd_sugar(const Rcpp::NumericVector& x){
    return Rcpp::sd(x); // uses Rcpp sugar
    }

    /***R
    x = 1:5
    r = sd(x)
    v1 = sd_r_cpp_call(x)
    v2 = sd_sugar(x)

    all.equal(r,v1)
    all.equal(r,v2)
    */

    关于r - 在 Rcpp 中调用 R 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38016851/

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