使用Rcpp从C ++调用R函数

时间:2012-09-01 04:44:21

标签: r inline rcpp

我正在教自己Rcpp并注意到Rcpp糖没有样品功能。 所以我决定用C ++在基础库中调用sample函数。 我有两个问题:

1。 关于参数prob的类型,我应该使用NumericVector吗? 使用矢量类型是否合法?

2。 关于输出的类型,我应该使用IntegerVector吗? 是否可以使用NumericVector类型?

似乎所有这些类型都很好(参见下面的代码),但我想知道哪种类型更好用。

<!-- language-all: lang-html -->
library(inline)
library(Rcpp)

src1 <- '
   RNGScope scope;

  NumericVector thenum(1),myprob(3);

  myprob[0]=0.1;
  myprob[1]=0.5;
  myprob[2]=0.4;

  Environment base("package:base");
  Function sample = base["sample"];

  thenum = sample(3,Named("size",1),Named("prob",myprob));

  return wrap(thenum);
'


src2 <- '
  RNGScope scope;

  IntegerVector theint(1);
  vector<double> myprob(3);
    myprob[0]=0.1;
  myprob[1]=0.5;
  myprob[2]=0.4;
  Environment base("package:base");
  Function sample = base["sample"];

  theint = sample(3,Named("size",1),Named("prob",myprob));

  return wrap(theint);
'


fun1 <- cxxfunction(signature(),body=src1,plugin="Rcpp")
fun2 <- cxxfunction(signature(),body=src2,include='using namespace std;',plugin="Rcpp")

fun1() ## work!
fun2() ## oh this works too! 

1 个答案:

答案 0 :(得分:3)

因为您从R调用sample(),所以整数和数字都与中的一样

R> set.seed(42); sample(seq(1L, 5L), 5, replace=TRUE)
[1] 5 5 2 5 4
R> set.seed(42); sample(seq(1.0, 5.0), 5, replace=TRUE)
[1] 5 5 2 5 4
R>