прервано при использовании rcpp - PullRequest
0 голосов
/ 09 февраля 2019

Я пишу некоторый код, и во время работы он прервался.Версия r 3.5.1.Я думаю, что-то не так с моим кодом rcpp, но я не могу его найти.Это просто показывает, что R сессия прервана.

################ Я не думаю, что в этой части что-то не так.
#include <Rcpp.h>

Rcpp::LogicalVector logical_index(Rcpp::IntegerVector idx, R_xlen_t n) {
  bool invert = false; 
  Rcpp::LogicalVector result(n, false);

  for (R_xlen_t i = 0; i < idx.size(); i++) {
    if (!invert && idx[i] < 0) invert = true;
    result[std::abs(idx[i])] = true;
  }

  if (!invert) return result;
  return !result;
}


// [[Rcpp::export]]
Rcpp::NumericVector 
  Subset(Rcpp::NumericVector x, Rcpp::IntegerVector idx) {
    return x[logical_index(idx, x.size())];
  }
# ################ Возможно, в этой части что-то не так.
library(Rcpp)
library(gRbase)
vec=0:13
a=combnPrim(vec,4)
cppFunction("
NumericVector r_test(NumericMatrix a, Function comp, Function fct,Function 
tempf, Function combnPrim, NumericVector Fv, NumericVector vec, Function 
Subset){
        NumericVector if1(4);
        NumericVector if2(2);
        NumericVector if3(4);
        NumericVector if4(4);
        NumericVector seq(14);
        NumericMatrix b(2,45);
        NumericMatrix c(4,70);
        for (int i1=0; i1<=a.ncol()-1; i1++){
        if1=a (_, i1);
        b=combnPrim(Subset(vec,-(if1)),2);
        for (int i2=0; i2<=b.ncol()-1; i2++){
        if2=b (_, i2);
        c=combnPrim(Subset(Subset(vec,-(if1)),-(if2)),4);
        for (int i3=0; i3<=c.ncol()-1; i3++){
        if3=c (_, i3);
        if4=Subset(Subset(Subset(vec,-(if1)),-(if2)),-(if3));
        seq=tempf(if1,if2,if3,if4);
        }}}return if1;}")

Fv=7.001327
setwd("D:/STAT 602")

sourceCpp("Subset.cpp")

fct=function(seq,data,fact){
  return(anova(lm(data[seq]~as.factor(fact)))$`F value`[1])
}
tempf=function(x1,x2,x3,x4){
  return(c(x1,x2,x3,x4))
}
comp=function(x,y){
  return(x>y)
}
r_test(a,comp, fct, tempf, combnPrim, Fv, vec, Subset)
#

combnPrim используется для поиска всех комбинаций вектора, и он выводит матрицу, а Subset используется так же, как вектор [-i].По отдельности все функции могут хорошо работать в cppFunction, но при их использовании все идет не так.

1 Ответ

0 голосов
/ 10 февраля 2019

Поскольку этот код довольно запутанный, я не собираюсь охотиться за точной, конкретной ошибкой.Однако я могу подтвердить, что @RalfStubner был прав, что ваша проблема в том, что вы пытаетесь получить доступ к элементу вектора, который не существует.

Если вы измените logical_index() на

LogicalVector logical_index(IntegerVector idx, R_xlen_t n) {
    bool invert = false;
    LogicalVector result(n, false);

    for (R_xlen_t i = 0; i < idx.size(); i++) {
        if (!invert && idx(i) < 0) invert = true;
        result(std::abs(idx(i))) = true;
    }

    if (!invert) return result;
    return !result;
}

так что доступ к элементу осуществляется через (), а не [], чтобы обеспечить проверку границ, 1 , а не просто прерывание, я вижу следующее:

r_test(a,comp, fct, tempf, combnPrim, Fv, vec, Subset)

Ошибка в r_test (a, comp, fct, tempf, combnPrim, Fv, vec, Subset):
Ошибка оценки: индекс вне границ: [index = 10;span = 8] ..

Это означает, что вы пытаетесь получить доступ к элементу вектора, который не существует.Я также могу сообщить вам основную причину, по которой это происходит: в logical_vector(), когда элемент idx больше n, это произойдет.Итак, в какой-то момент в r_test() вы звоните Subset() с idx, у которого элемент больше x.size().


1 Вы правы, что вы будетеполучить ошибку при попытке использовать () для подмножества векторов при подстановке вектора на другого вектора.Однако это работает при доступе к одному элементу вектора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...