以下是代码:
#include <Rcpp.h>
#include <iostream>
#include <assert.h>
#include <stdio.h>
using namespace Rcpp;
// [[Rcpp::export]]
double eudist(NumericVector x, NumericVector y) {
int nx = x.size();
int ny = y.size();
std::cout << nx << '\n' << ny << std::endl;
assert(nx == ny);
double dist=0;
for(int i = 0; i < nx; i++) {
dist += pow(x[i] - y[i], 2);
}
return sqrt(dist);
}
在将其获取到R之后,我得到以下结果,显然在出现错误时它不会中止:
#////////////////////////////////////////////////////
sourceCpp('x.cpp')
#////////////////////////////////////////////////////
eudist(c(0, 0), c(1, 1))
2
2
[1] 1.4142
#////////////////////////////////////////////////////
eudist(c(0, 0), c(1, 1, 1))
2
3
[1] 1.4142
答案 0 :(得分:5)
请注意,CRAN上传明确禁止使用assert()
等。从CRAN Repo Policy页面引用:
包中提供的代码和示例永远不应该做任何事情 这可能被视为恶意或反社会。以下是 过去经验中的说明性例子。
- 编译代码永远不应该终止运行它的R进程。因此,C / C ++调用
assert
/abort
/exit
,Fortran调用 必须避免使用STOP
等。 R代码也不能致电q()
。
所以关于调试模式的答案在技术上是正确的,但是请注意,如果您打算在某个时候上传CRAN,则不应该使用它。
答案 1 :(得分:4)
使用throw
而不是assert
来解决问题,Rcpp实际上会把东西放在一个合适的try-catch块中,这非常好。
#include <Rcpp.h>
#include <iostream>
#include <assert.h>
#include <stdio.h>
using namespace Rcpp;
// [[Rcpp::export]]
double eudist(NumericVector x, NumericVector y) {
int nx = x.size();
int ny = y.size();
Rcout << nx << '\n' << ny << std::endl;
if(nx != ny) {
throw std::invalid_argument("Two vectors are not of the same length!");
}
double dist=0;
for(int i = 0; i < nx; i++) {
dist += pow(x[i] - y[i], 2);
}
return sqrt(dist);
}
答案 2 :(得分:0)
对于g ++,使用-g启用调试选项:
g++ -g code.cpp
Visual Studio中的调试模式。