如何使用默认参数导出Rcpp Class方法

时间:2014-03-07 04:47:37

标签: r rcpp

我有一个c ++类myClass,它有一个方法foo(int x=0),它有一个参数x,默认值为0.c ++类可以通过

导出到R
RCPP_MODULE(my_module) {
    class_< myClass >( "myClass" )
    .constructor()
    .method( "foo", &myClass::foo )
    ;
}

但是,在R中,如果没有指定myClass$foo的值,我将无法调用x。 无论默认值是什么,我都必须指定x的值。

所以我的问题是如何使用默认参数导出Rcpp类方法。我试图通过互联网搜索它。我发现的最接近的是

using namespace Rcpp;
double norm( double x, double y ) { return sqrt( x*x + y*y );
}
RCPP_MODULE(mod_formals2) {
    function("norm", &norm,
}

但它在我的情况下不起作用。

1 个答案:

答案 0 :(得分:5)

我最近遇到了同样的问题。查看处理类的rcpp源文件(我的设置中为~/R/x86_64-pc-linux-gnu-library/3.2/Rcpp/include/Rcpp/module/class.h)后,我认为目前无法进行。

我提出的最佳解决方法是在R中创建一个包装器来处理默认参数。

以下是演示如何操作的完整示例。我定义了一个简单的函数,它接受3个参数并输出它们的总和。第二个和第三个参数是可选的,默认设置为10100

mwe.cpp

#include <Rcpp.h>

class  MWE {
public:
  int sum_them(int mandatory_arg,
               int optional_arg1,
               int optional_arg2)
  {
    return (mandatory_arg+optional_arg1+optional_arg2);
  }
};

RCPP_MODULE(mod_mwe) {
  Rcpp::class_<MWE>( "MWE" )
  .constructor()
  .method("sum_them", &MWE::sum_them)
  ;
}

mwe.R

require('Rcpp')

# source the C++ code
sourceCpp('mwe.cpp')

# create an instance of the class:
my_mwe = new(MWE)

# assign a wrapper with default arguments to the instance:
assign('sum_them_wrapper',
       function(mandatory_arg,
                optional_arg1=10,
                optional_arg2=100) {
         return(my_mwe$sum_them(mandatory_arg, optional_arg1, optional_arg2))
       },
       envir = my_mwe
       )

这会输出预期结果:

> my_mwe$sum_them_wrapper(3, optional_arg2=500)
[1] 513