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::IntegerVector
的 documentation,您可以通过 .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) )
我正在使用 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::IntegerVector
的 documentation,您可以通过 .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) )