我想了解是什么让这个程序崩溃了。我已经看到至少三个相关问题here,here和here,但我没有找到解决问题的明确答案,所以这里有一些示例代码来复制问题
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 ++之间的无缝集成更加无缝,这是我第一次想到的,因为我已经看到我不是唯一一个面临这个问题的人,看起来我们都在制作一些(至少在RStudio上),但它是什么?
基本上,我想确定我不会错过这里完全明显的东西,因为到目前为止我看到的所有答案似乎都暗示情况就是这样。
注意:这是我用Rcpp测试的较长功能的缩短版本,原始版本似乎在我称之为少数次的情况下工作正常,但它最终也会崩溃。
更新:删除了rm(),oops。
答案 0 :(得分:3)
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)
,并且那里的东西变成梨形。它第一次运行它并没有崩溃的事实只是意味着你很幸运(或不幸,因为它诱使你陷入虚假的自信心)。
答案 1 :(得分:1)
所以这是一个带有
的修复版本#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:~$