Я бы хотел понять, что вызывает сбой этой программы. Я видел по крайней мере три связанных вопроса здесь , здесь и здесь , но я не нашел четкого ответа на этот вопрос, поэтому вот некоторые Пример кода для воспроизведения проблемы.
Код 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 (), упс.