Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个Rcpp函数在它自己的范围之外改变变量?_R_Rcpp - Fatal编程技术网

为什么这个Rcpp函数在它自己的范围之外改变变量?

为什么这个Rcpp函数在它自己的范围之外改变变量?,r,rcpp,R,Rcpp,我正在运行下面的示例代码,其中演示了如何将R数组转换为RcppArmadillo多维数据集。代码如下 require(inline) require(RcppArmadillo) src <- ' using namespace Rcpp; NumericVector vecArray(myArray); IntegerVector arrayDims = vecArray.attr("dim"); arma::cube cub

我正在运行下面的示例代码,其中演示了如何将R数组转换为RcppArmadillo多维数据集。代码如下

require(inline)
require(RcppArmadillo)

src <- '
       using namespace Rcpp;

       NumericVector vecArray(myArray);
       IntegerVector arrayDims = vecArray.attr("dim");

       arma::cube cubeArray(vecArray.begin(), arrayDims[0], arrayDims[1], arrayDims[2], false);

       //change one element in the array/cube
       cubeArray(0,0,0) = 518;  

       return(wrap(cubeArray));  
'

readCube = cxxfunction(signature(myArray="numeric"),body=src, plugin="RcppArmadillo")

set.seed(345)
testArray = array(rnorm(8), dim=c(2,2,2))
print(testArray[1,1,1])
# -0.7849082
readCube(testArray)[1,1,1]
# 518
print(testArray)[1,1,1]
# 518
require(内联)
要求(RcppArmadillo)

多亏了德克,现在我知道我被困在哪里了。以下是我自己的解决方案:

这个问题可以通过使用clone()或创建新的犰狳立方体对象来解决。这两种解决方案如下

// Using clone()
src <- '
       using namespace Rcpp;

       NumericVector vecArray(clone(myArray));
       IntegerVector arrayDims = vecArray.attr("dim");

       arma::cube cubeArray(vecArray.begin(), arrayDims[0], arrayDims[1], arrayDims[2], false);

       //change one element in the array/cube
       cubeArray(0,0,0) = 518;  

       return(wrap(cubeArray));  
'

readCube = cxxfunction(signature(myArray="numeric"),body=src, plugin="RcppArmadillo")
//使用clone()

多亏了德克,现在我知道我被困在哪里了。以下是我自己的解决方案:

这个问题可以通过使用clone()或创建新的犰狳立方体对象来解决。这两种解决方案如下

// Using clone()
src <- '
       using namespace Rcpp;

       NumericVector vecArray(clone(myArray));
       IntegerVector arrayDims = vecArray.attr("dim");

       arma::cube cubeArray(vecArray.begin(), arrayDims[0], arrayDims[1], arrayDims[2], false);

       //change one element in the array/cube
       cubeArray(0,0,0) = 518;  

       return(wrap(cubeArray));  
'

readCube = cxxfunction(signature(myArray="numeric"),body=src, plugin="RcppArmadillo")
//使用clone()

src您可能想阅读有关
clone()
,例如:谢谢!这完美地回答了我的问题。我建议将您的解决方案作为答案发布,而不是编辑问题。您可能想阅读有关
clone()
,例如:谢谢!这完美地回答了我的问题。我建议将你的解决方案作为答案发布,而不是编辑问题。