在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
}