我已经为我的C ++库编写了R绑定,但是出于可用性的考虑,我想在R中稍微改变方法和构造函数的行为:添加默认值并将变量包装到列表中。
例如:我不希望调用生成器ClassName(name, list(var1=1, var2=2))
,而是希望拥有ClassName(name, var1=1, var2=2)
最初,我只是使用loadModules
并直接使用C ++方法,但是后来切换到setRcppClass
,这使我可以覆盖包括initialize
的方法。最初,我尝试使用callNextMethod无济于事,然后基本上求助于复制粘贴Rcpp提供的initialize
方法所做的一些小的调整。
setRcppClass("ClassName", module="mymodule",
methods=list(
initialize=function(.Object, name, ...) {
args <- list(...)
argNames <- allNames(args)
cppArgs <- nzchar(argNames)
.CppObject <<- .CppGenerator$new(name, args[cppArgs])
},
show=function() {
cat('ClassName of type:', .CppObject$name(), '\n')
}
))
除了我需要显式命名name
参数外,这几乎满足了我的要求:
ClassName(name="Foo", var1=1, var2=2)
显然,我也想避免复制Rcpp代码,而是以某种方式调用它。
另外,R CMD检查抱怨所有对
.CppGenerator .CppObject allNames