Why does assert not work here?

后端 未结 3 1536
清歌不尽
清歌不尽 2021-01-05 17:04

Here is the code:

#include 
#include 
#include 
#include 

using namespace Rcpp;


// [[Rcpp::ex         


        
相关标签:
3条回答
  • 2021-01-05 17:49

    Note that assert() etc are explicitly prohibited for CRAN uploads. Quoting from the CRAN Repo Policy page:

    The code and examples provided in a package should never do anything which might be regarded as malicious or anti-social. The following are illustrative examples from past experience.

    • Compiled code should never terminate the R process within which it is running. Thus C/C++ calls to assert/abort/exit, Fortran calls to STOP and so on must be avoided. Nor may R code call q().

    So the answer about debug mode is technically correct, but also note that you are not supposed to use this if you plan to upload CRAN at some point.

    0 讨论(0)
  • 2021-01-05 17:49

    For g++ use -g to enable debug options:

    g++ -g code.cpp
    

    Or debug mode in Visual Studio.

    0 讨论(0)
  • 2021-01-05 17:55

    The problem is solved by using throw instead of assert, Rcpp will actually put things in a proper try-catch block, which is super nice.

    #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);
    }
    
    0 讨论(0)
提交回复
热议问题