为什么断言不起作用?

时间:2014-01-28 15:06:45

标签: c++ r rcpp

以下是代码:

#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

3 个答案:

答案 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中的调试模式。