R 中的 Rcpp Quicksort 错误?

Rcpp Quicksort error in R?

我正在使用 RCPP 构建用于快速排序的 C++ 函数快速排序。 我正在尝试通过 R 中的 cxxfunction 编译和加载此函数。 我需要使用 cxxFunction。我在 R 中收到以下消息:

error: cannot convert 'Rcpp::IntegerVector {aka Rcpp::Vector<13, Rcpp::PreserveStorage>}' to 'int*' for argument '1' to 'int quicksort(int*, int, int)' make: *** [file15ecb338ec.o] Error 1

谁能告诉我这有什么问题吗?

incl <- 'int quicksort(int xx[], int left, int right) {

int i = left; 
int j = right;
int tmp;
int pivot = xx[(left + right) / 2];

/* partition */
while (i <= j) {
while (xx[i] < pivot)
i++;
while (xx[j] > pivot)
j--;
if (i <= j) {
tmp = xx[i];
xx[i] = xx[j];
xx[j] = tmp;
i++;
j--;
}
}

/* recursion */
if (left < j){
quicksort(xx, left, j);
}
if (i < right){
quicksort(xx, i, right);
}

return (quicksort(xx,i,j));
}
'
sortCpp <- cxxfunction(signature( x = "integer",left = "integer",
                                  right = "integer"),
                       body = 'IntegerVector arr(x);
                       int a = as<int>(left);
                       int b = as<int>(right);
                       return wrap(quicksort(arr,a,b));',
                       include = incl,
                       plugin = "Rcpp",
                       verbose = TRUE)

为了看看我是否可以使用 cxxfunction 调用递归函数,我创建了一个阶乘函数并通过 cxxfunction 调用它并且它工作正常。

incl <- 'int factorial(int n)
{
  return (n == 1 || n == 0) ? 1 : factorial(n - 1) * n;
}
'


factcpp <- cxxfunction(signature( x = "integer"),
                       plugin = "Rcpp",
                       include = incl,
                       body = 'int xnew = as<int>(x);
                       return wrap( factorial(x) );
                       ',
                       verbose = TRUE)

问题正是编译器所说的。您的函数需要 int*,但您传递给它的是 Rcpp::IntegerVector。查看 Rcpp::IntegerVectordocumentation,您可以通过 .begin() 检索原始指针,因此您可以通过 quicksort(arr.begin(), a, b).

调用

另外,除非你真的需要推出自己的快速排序,否则我只会使用标准库的 std::sort:

src <- 'Rcpp::IntegerVector v = Rcpp::IntegerVector(vp);
        std::sort(v.begin(), v.end());
        return wrap(v);'
fun <- cxxfunction(signature(vp="integer"), body=src, plugin="Rcpp")
fun( c(5, 2, 7, -3) )