RStudio продолжает падать с Rcpp - PullRequest
0 голосов
/ 02 мая 2018

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

Код R:

library(Rcpp)

Rcpp::sourceCpp("myfunction.cpp")

data1      <- rnorm(2000)
data2      <- rnorm(2000)

mydata <- matrix(cbind(data1, data2), nrow=2000, ncol=2)
values <- log(1:6)

for (i in 1:1000) {
  myfunction(values, mydata)
}

Код C ++:

#include "Rcpp.h"
#include "math.h"
using namespace Rcpp;

// [[Rcpp::export]]
double myfunction(const NumericVector& theta, const NumericMatrix& data) {

  double ans = 0;

  int theta_size = theta.length();
  NumericVector mytheta(theta_size);

  int data_size = data.nrow();
  NumericMatrix mat(data_size, 2);

  for (int i = 0; i < theta_size; i++) {
    mytheta(i) = exp(theta(i));
  }

  if ( true ) {  // Flow control

    for (int i = 0; i < data_size; i++) {
      mat(i, 1) = pow(data(i-1, 1), 2) + mytheta(1)*mat(i-1, 1);
      ans = ans + 1;
    }

    for (int i = 0; i < data_size; i++) {
      mat(i, 2) = pow(data(i-1, 2), 2) + mytheta(4)*mat(i-1, 2);
      ans = ans + 1;
    }

  }

  Rcout << "Ok!\n";

  return ans;
}

Все отлично работает по крайней мере, в первый раз Я использую myfunction(), но затем происходит сбой при вызове в цикле R for. Я переустановил R, Rtools и RStudio (для Windows), чтобы проверить, не было ли что-то не так с установкой, но я все еще сталкиваюсь с той же проблемой.

Это делает бесшовную интеграцию между R и C ++ менее плавной, как я впервые подумал, и, поскольку я увидел, что я не единственный, кто сталкивается с этой проблемой, похоже, что мы все делаем некоторые очевидная ошибка при запуске с Rcpp (хотя бы на RStudio), но что это?

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

Примечание : это укороченная версия более длинной функции, которую я тестировал с Rcpp, кажется, что оригинальная версия отлично работает первые несколько раз, когда я ее называю, но это также в конечном счете терпит крах.

Обновление: удалено rm (), упс.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Так вот отремонтированная версия с

  • @ Поправка HongOoi к индексу цикла
  • моя поправка к столбцам
  • R код в файле C ++
  • нет выхода из C ++ кода, вызываемого N раз
  • вывод в конце
  • посев RNG, чтобы сделать его воспроизводимым

код

#include "Rcpp.h"
#include "math.h"
using namespace Rcpp;

// [[Rcpp::export]]
double myfunction(const NumericVector& theta, const NumericMatrix& data) {

  double ans = 0;

  int theta_size = theta.length();
  NumericVector mytheta(theta_size);

  int data_size = data.nrow();
  NumericMatrix mat(data_size, 2);

  for (int i = 0; i < theta_size; i++) {
    mytheta(i) = exp(theta(i));
  }

  if ( true ) {  // Flow control

    for (int i = 1; i < data_size; i++) {
      mat(i, 0) = pow(data(i-1, 0), 2) + mytheta(1)*mat(i-1, 0);
      ans = ans + 1;
    }

    for (int i = 1; i < data_size; i++) {
      mat(i, 1) = pow(data(i-1, 1), 2) + mytheta(4)*mat(i-1, 1);
      ans = ans + 1;
    }

  }

  //Rcout << "Ok!\n";

  return ans;
}

/**** R
set.seed(123)
data1      <- rnorm(2000)
data2      <- rnorm(2000)

mydata <- matrix(cbind(data1, data2), nrow=2000, ncol=2)
values <- log(1:6)

for (i in 1:1000) {
  myfunction(values, mydata)
}
cat("Success\n")
*/

Демо

edd@rob:~$ Rscript -e 'Rcpp::sourceCpp("/tmp/trusky.cpp")'

R> set.seed(123)

R> data1 <- rnorm(2000)

R> data2 <- rnorm(2000)

R> mydata <- matrix(cbind(data1, data2), nrow = 2000, 
+     ncol = 2)

R> values <- log(1:6)

R> for (i in 1:1000) {
+     myfunction(values, mydata)
+ }

R> cat("Success\n")
Success
edd@rob:~$ 
0 голосов
/ 03 мая 2018
for (int i = 0; i < data_size; i++) {
  mat(i, 1) = pow(data(i-1, 1), 2) + mytheta(1)*mat(i-1, 1);
  ans = ans + 1;
}

Когда i == 0, вы пытаетесь получить доступ к data(-1, 1), и все становится грушевидным оттуда. Тот факт, что он не потерпел крах в первый раз, когда вы запустили его, означает, что вам повезло (или не повезло, потому что это заманило вас в ложное чувство уверенности).

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