如何将R包中的函数添加到rcpp代码中

豪廷

我正在编写 rcpp 代码,我想在包“invgamma”中使用函数 dinvgamma(rinvgamma)。以下是我的全部代码。我尝试将包“invgamma”放入环境中,然后将其中的函数作为 Rcpp::Function 调用。

#include <Rcpp.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <R_ext/Utils.h>
using namespace Rcpp;
// [[Rcpp::export]]

RcppExport SEXP updatesigama2_mu(SEXP sigma2_mu, 
                                 SEXP mu, 
                                 SEXP u0, 
                                 SEXP v0, 
                                 SEXP K, 
                                 SEXP SS,
                                 SEXP acc,
                                 SEXP sigma2_mu_list)
{
  BEGIN_RCPP

  Rcpp::Environment invgamma("package:invgamma");
  Rcpp::Function dinvgamma = invgamma["dinvgamma"];
  Rcpp::Function rinvgamma = invgamma["rinvgamma"];


  double xacc = Rcpp::as<double>(acc);
  Rcpp::NumericVector xsigma2_mu_list(sigma2_mu_list);

  Rcpp::NumericVector xmu(mu);//vector mu
  double xsigma2_mu = Rcpp::as<double>(sigma2_mu);
  int xK = Rcpp::as<int>(K);
  int xSS = Rcpp::as<int>(SS);// time for irrecation 
  double xu0 = Rcpp::as<double>(u0);
  double xv0 = Rcpp::as<double>(v0);
  Rcpp::RNGScope scope;
  int c = 0; int d = 0;
  c = xu0 + 0.5*xK + 1;
  d = xv0 + 0.5*sum(xmu);
  for (int ss = 0; ss<xSS; ss++){//iteration
    Rcpp::NumericVector tmp = rinvgamma(1,0,1);//proposal distribution Normal(0,10)
    Rcpp::NumericVector u = Rcpp::runif(1);
    Rcpp::NumericVector a = dinvgamma(tmp[0], c, pow(d,-1),d, false ) * dinvgamma(xsigma2_mu,1,0,1,false)/
      (dinvgamma(xsigma2_mu,c,pow(d,-1),d,false)*dinvgamma(tmp[0],1,0,1,false))
    xsigma2_mu_list[1] = tmp[0];
    xsigma2_mu_list[2] = a[0];
    if ( u[0] <= a[0] ){
      xsigma2_mu = tmp[0];
      xacc += 1;
    }
  }

  return Rcpp::List::create(Rcpp::Named("sigma2_mu") = xsigma2_mu,
                            Rcpp::Named("acc") = xacc,
                            Rcpp::Named("sigma2_mu_list") = xsigma2_mu_list);

  END_RCPP
}

我将它用作以下表格,但它不起作用。它是否错过了一些东西?

Rcpp::NumericVector a = dinvgamma(tmp[0], c, pow(d,-1),d, false ) * dinvgamma(xsigma2_mu,1,0,1,false)/
          (dinvgamma(xsigma2_mu,c,pow(d,-1),d,false)*dinvgamma(tmp[0],1,0,1,false))
拉尔夫·斯图纳

加载某个包中定义的 R 函数没有原则问题。但是,必须附加该软件包才能使其环境可用。请参阅rfunc()示例中的函数在逆 Gamma 的情况下,根据 Gamma 函数定义您自己的函数会更容易。请参阅sugar()示例中的函数

例子:

#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::List rfunc() {
  Rcpp::Environment invgamma("package:invgamma");
  Rcpp::Function dinvgamma = invgamma["dinvgamma"];
  Rcpp::Function rinvgamma = invgamma["rinvgamma"];
  Rcpp::NumericVector tmp = rinvgamma(5, 1);
  Rcpp::NumericVector a = dinvgamma(tmp, 1);
  return Rcpp::List::create(Rcpp::Named("tmp") = tmp,
                Rcpp::Named("a") = a);
}


Rcpp::NumericVector rinvgamma(R_xlen_t n,
                  double shape,
                  double rate = 1.0) {
  return 1.0/Rcpp::rgamma(n, shape, rate);
}

Rcpp::NumericVector dinvgamma(Rcpp::NumericVector x,
                  double shape,
                  double rate = 1.0,
                  bool log = false) {
  Rcpp::NumericVector log_f = Rcpp::dgamma(1.0/x, shape, rate, true) - 2 * Rcpp::log(x);
  if (log) 
    return log_f;
  return Rcpp::exp(log_f);
}

// [[Rcpp::export]]
Rcpp::List sugar() {
  Rcpp::NumericVector tmp = rinvgamma(5, 1);
  Rcpp::NumericVector a = dinvgamma(tmp, 1);
  return Rcpp::List::create(Rcpp::Named("tmp") = tmp,
                Rcpp::Named("a") = a);
}


/*** R
library(invgamma)
set.seed(42)
rfunc()
set.seed(42)
sugar()
microbenchmark::microbenchmark(rfunc(), sugar())
*/

输出:

> library(invgamma)

> set.seed(42)

> rfunc()
$tmp
[1]  0.5156511  5.5426504  1.8711424 41.7271256  2.3376817

$a
[1] 0.5408323347 0.0271775313 0.1673728698 0.0005607317 0.1193024224


> set.seed(42)

> sugar()
$tmp
[1]  0.5156511  5.5426504  1.8711424 41.7271256  2.3376817

$a
[1] 0.5408323347 0.0271775313 0.1673728698 0.0005607317 0.1193024224


> microbenchmark::microbenchmark(rfunc(), sugar())
Unit: microseconds
    expr     min       lq      mean   median      uq      max neval
 rfunc() 115.098 117.1595 130.80325 117.9270 119.429 1342.420   100
 sugar()   7.333   8.3810  26.03649   9.2195  10.023 1657.404   100

使用 Rcpp 糖的性能提升令人印象深刻!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将模块添加到 nginx 包中

来自分类Dev

如何将Changelog或NEWS文件添加到我的R包中?

来自分类Dev

如何将sql添加到javaScipt函数中?

来自分类Dev

如何将包添加到自定义 Laravel 包中?

来自分类Dev

如何将变更日志添加到Cabal软件包中?

来自分类Dev

如何将打字稿定义文件添加到npm包中?

来自分类Dev

如何将发布者证书添加到Cx_freeze MSI包中?

来自分类Dev

如何将软件包添加到netbeans的其他测试源中

来自分类Dev

如何将软件包添加到netbeans的其他测试源中

来自分类Dev

如何将程序包添加到我的jar文件中

来自分类Dev

如何将依赖项添加到我的Julia包中?

来自分类Dev

如何将CoreML模型添加到Swift包中?

来自分类Dev

如何将axios包添加到正在使用的chrome扩展程序中?

来自分类Dev

如何将软件包添加到所有Debian发行版中?

来自分类Dev

如何将Bootstrap程序包添加到流星应用程序中?

来自分类Dev

如何将参考包添加到 Eclipse Pydev 中

来自分类Dev

如何将 Nuget 包添加到我的 Visual Studio 扩展中的项目?

来自分类Dev

如何将此 setInterval 函数添加到此 React 代码中?

来自分类Dev

以编程方式将代码添加到函数中

来自分类Dev

如何在C#中调用将文本添加到现有代码中的函数?

来自分类Dev

如何使用R中的gtsummary包将下标添加到表中的标签?

来自分类Dev

如何将Java源代码添加到Gradle buildscript类路径中?

来自分类Dev

如何将newDataValidation()代码块添加到我的Google Apps脚本中

来自分类Dev

如何将变量添加到Perl单行代码中?

来自分类Dev

如何将onClickLIstener添加到我的代码中以执行已经实现的方法

来自分类Dev

如何将makefile中的编译器命令行添加到源代码

来自分类Dev

如何将源代码添加到使用 sphinx 生成的 LaTeX 文档中

来自分类Dev

如何将 javascript 代码添加到 reactJS 文件中?

来自分类Dev

如何将值从 JSON 添加到模型,在我下面的代码中

Related 相关文章

  1. 1

    如何将模块添加到 nginx 包中

  2. 2

    如何将Changelog或NEWS文件添加到我的R包中?

  3. 3

    如何将sql添加到javaScipt函数中?

  4. 4

    如何将包添加到自定义 Laravel 包中?

  5. 5

    如何将变更日志添加到Cabal软件包中?

  6. 6

    如何将打字稿定义文件添加到npm包中?

  7. 7

    如何将发布者证书添加到Cx_freeze MSI包中?

  8. 8

    如何将软件包添加到netbeans的其他测试源中

  9. 9

    如何将软件包添加到netbeans的其他测试源中

  10. 10

    如何将程序包添加到我的jar文件中

  11. 11

    如何将依赖项添加到我的Julia包中?

  12. 12

    如何将CoreML模型添加到Swift包中?

  13. 13

    如何将axios包添加到正在使用的chrome扩展程序中?

  14. 14

    如何将软件包添加到所有Debian发行版中?

  15. 15

    如何将Bootstrap程序包添加到流星应用程序中?

  16. 16

    如何将参考包添加到 Eclipse Pydev 中

  17. 17

    如何将 Nuget 包添加到我的 Visual Studio 扩展中的项目?

  18. 18

    如何将此 setInterval 函数添加到此 React 代码中?

  19. 19

    以编程方式将代码添加到函数中

  20. 20

    如何在C#中调用将文本添加到现有代码中的函数?

  21. 21

    如何使用R中的gtsummary包将下标添加到表中的标签?

  22. 22

    如何将Java源代码添加到Gradle buildscript类路径中?

  23. 23

    如何将newDataValidation()代码块添加到我的Google Apps脚本中

  24. 24

    如何将变量添加到Perl单行代码中?

  25. 25

    如何将onClickLIstener添加到我的代码中以执行已经实现的方法

  26. 26

    如何将makefile中的编译器命令行添加到源代码

  27. 27

    如何将源代码添加到使用 sphinx 生成的 LaTeX 文档中

  28. 28

    如何将 javascript 代码添加到 reactJS 文件中?

  29. 29

    如何将值从 JSON 添加到模型,在我下面的代码中

热门标签

归档