我想创建一个更快的x == x1 & y %in% Table
版本,可能与其他逻辑表达式混合使用。但是,当我运行以下命令时,我可以可靠地产生段错误
#include <omp.h> #include <Rcpp.h> using namespace Rcpp; bool do_is_in(int x, IntegerVector Table, int tn) { for (int i = 0; i < tn; ++i) { if (x == Table[i]) { return true; } } return false; } // [[Rcpp::export]] LogicalVector in_and_eq(IntegerVector x, int x1, IntegerVector y, IntegerVector Table) { R_xlen_t n = x.length(); LogicalVector out = no_init(n); const int tn = Table.length(); #pragma omp parallel for for (R_xlen_t i = 0; i < n; ++i) { out[i] = x[i] == x1 && do_is_in(y[i], Table, tn); } return out; }
i <- rep_len(1:17, 100e3) j <- rep_len(1:19, 100e3) in_and_eq(i, 15L, j, 15:18) # may require a few repetitions
我怀疑这与
const int tn
有关,但我不确定这是否是红色鲱鱼。我将其包括在内是为了避免每个Table.length()
调用都调用do_is_in
的开销(可能很小)。
我想创建一个更快的x == x1&y%in%Table版本,可能与其他逻辑表达式混合在一起。但是,当我运行以下#include&...
R绝对是100%不是多线程安全的。例如,您对do_is_in的调用按值接受IntegerVector类型的对象。这将调用一个复制构造函数,该复制构造函数(我假设)将通过非线程0的线程与R进行交互,从而导致崩溃。