在Rcpp中通过省略号传递多个参数(…)
我正在尝试使用。。。但它不起作用。如何正确地做到这一点在Rcpp中通过省略号传递多个参数(…),r,rcpp,R,Rcpp,我正在尝试使用。。。但它不起作用。如何正确地做到这一点 NumericVector function(SEXP xR, ...){ NumericVector x(xR); int lenx = x.size(); NumericVector ret(lenx); for(int i=0; i < lenx; i++){ if(x[i]<0){ ret[i] = 0; }else if(x[i]&
NumericVector function(SEXP xR, ...){
NumericVector x(xR);
int lenx = x.size();
NumericVector ret(lenx);
for(int i=0; i < lenx; i++){
if(x[i]<0){
ret[i] = 0;
}else if(x[i]>1){
ret[i] = 1;
}else{
ret[i] = anotherfunction(x[i], ...);
}
}
return ret;
}
NumericVector函数(SEXP xR,…){
数值向量x(xR);
int lenx=x.size();
数值向量ret(lenx);
对于(int i=0;i
在当前版本中,我遇到以下错误:
<代码>预期的“原表达式”…'ToMt/<代码> < P>您可能混淆了R语言构造<代码>…>代码>,也假定您在C++中也存在一些东西。而C++确实有RCCPP不支持的<代码> VARARGs<代码>,我们都有“<代码> >调用())/>代码>接口< /P>
SEXP somefunction(SEXP a, SEXP b, SEXP c, ...)
在这里,…
仅用于说明:可以有0,1,2,3<代码>SEXP参数。但是你使用的那些必须是完全合格的。简而言之,使用…
会导致您看到的语法错误。有关详细信息,请参阅
作为旁注,这就是为什么我们在Rcpp中有宏生成的代码。现在,用C++ 11,您也可以使用C++代码中的可变模板(RCPP11在其内部代码中使用了很大的效果),但当然不会改变R的接口,它仍然是相同的<代码>。可变模板非常好,并且可以在C++代码中使用,无论是RCPP还是RCPP11,但是它们不改变接口到R。您需要一组固定的参数,并且不能依赖于可变数量。
也就是说,如果您只是将一个
列表
对象作为参数之一传递,那么您可以随意按位置或名称遍历它并检查内容。这在本质上与您的问题最为接近。Rcpp11
具有变量数量的概念,带有Dots
和NamedDots
类。你可以这样做:
#include <Rcpp11>
List force_dots( const Dots& dots ){
List out(n) ;
for( int i=0; i<n; i++){
out[i] = Rcpp_eval( dots.promise(i), dots.environment(i)) ;
}
return out ;
}
// [[export]]
List dots_example(NumericVector x, Dots dots){
int n = dots.size() ;
List args = force_dots(dots) ;
return args ;
}
/*** R
dots_example(1:10, "e" )
# [[1]]
# [1] "e"
*/
这只是部分地回答了这个问题,即如何从R.
传递给C++一个可变数量的参数。 您还需要类似于R的do.call
,以便在调用另一个函数时调用。目前,您必须手动执行此操作,直到我们找到一种方法来实现有用的do\u调用
> dots_example
function(x, ...){
res <- .Call( "sourceCpp_dots_example" , x, environment())
res
}