Почему моя функция Rcpp, которая возвращает вектор <vector <int >>, аварийно завершает работу?

0

Вот мой тестовый код

#include <Rcpp.h>
using namespace Rcpp;

#include "/Users/jjunju/Documents/R/accum/accum.h"

// Below is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp 
// function (or via the Source button on the editor toolbar)

// For more on using Rcpp click the Help button on the editor toolbar

// [[Rcpp::export]]
int timesTwo(int x) {
   return x * 2;
}

// [[Rcpp::export]]
void testExternalHeader(){
  matrix <int> test(3,3);
  test.Print();
}

// [[Rcpp::export]]
vector<vector <int> > testVector(){
  vector<vector <int> > a;
  a.resize(3); //rows
  for(int i=0;i<3;i++){
    a.resize(3); //cols
    for(int j=0;j<3;j++){
    a[i][j]=i*3+j;
    }
  }
  return(a);
}

Вот кадр моей сессии Rstudio. Вы можете видеть, что моя функция testVector вылетает из Rstudio. У меня нет проблем с любыми другими функциями из моего внешнего заголовка. Только этот! : ( Изображение 174551

Теги:
rcpp

1 ответ

2
Лучший ответ

Ваш вектор a содержит 3 пустых вектора, но вы относитесь к ним так, как будто их здесь нет:

a[i][j]=i*3+j; // a[i] has size 0 here

Этот доступ за пределами границ является неопределенным поведением. Причина в том, что это

a.resize(3); //cols

это не то, что вы думаете. Это по существу не имеет никакого эффекта, потому что уже размер 3 на данном этапе. a

Если вы хотите 3 на 3 вектор векторов инициализации следующим образом: a

vector<vector <int> > a(3, std::vector<int>(3));
  • 0
    Я обнаружил, что должен был набрать «a [i] .resize (3)» внутри цикла. Теперь он работает, но, тем не менее, в R in возвращает список вместо матрицы!> ´testVector () [[1]] [1] 0 1 2 [[2]] [1] 3 4 5 [[3]] [1 ] 6 7 8´
  • 0
    @jjunju ОК. Если вы последуете моему предложению, вам не нужно вызывать resize , но я не знаю, как вернуть вложенный вектор в R.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню