Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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,我对Rcpp中的一个简单代码有问题。我的问题是,我想通过将向量传递给函数来改变向量。例如: //[[Rcpp::export]] void ones(IntegerVector x, int lx){ int i; for(i = 0; i < lx; i++){ x(i) = 1; } } 向量x不变。我怎样才能解决这个问题 编辑: 如果我传递x as&x,我如何更改它的值 编辑:在尝试前两个答案中提出的两种方法后,没有任何变化 编辑:重新启动Rstud

我对Rcpp中的一个简单代码有问题。我的问题是,我想通过将向量传递给函数来改变向量。例如:

//[[Rcpp::export]]
void ones(IntegerVector x, int lx){
   int i;
   for(i = 0; i < lx; i++){
       x(i) = 1;
   }
}
向量x不变。我怎样才能解决这个问题

编辑: 如果我传递x as&x,我如何更改它的值

编辑:在尝试前两个答案中提出的两种方法后,没有任何变化


编辑:重新启动Rstudio,现在可以工作了。。。。。。。这是Rstudio用户的常见问题吗?

实际上,由于Rcpp类是代理对象,您可以不通过引用进行传递,但必须传递正确类型的向量。在函数签名中,x是一个整数向量,但由于rep-1,10返回的是一个数字,而不是整数,因此传入一个数值向量。由于类型不匹配,输入必须强制到IntegerVector,这意味着创建了一个副本,并且没有修改原始数值向量。比如说,

#include <Rcpp.h>

// [[Rcpp::export]]
void ones(Rcpp::IntegerVector x, int lx) {
   for (int i = 0; i < lx; i++) {
       x[i] = 1;
   }
}

/*** R

x <- rep(-1, 10)
class(x)
#[1] "numeric"

ones(x, length(x))
x
#[1] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

y <- as.integer(rep(-1, 10)) # or, rep(-1L, 10)
class(y)
#[1] "integer"

ones(y, length(y))
y
#[1] 1 1 1 1 1 1 1 1 1 1

*/ 

实际上,由于Rcpp类是代理对象,所以可以不通过引用进行传递,但必须传递正确类型的向量。在函数签名中,x是一个整数向量,但由于rep-1,10返回的是一个数字,而不是整数,因此传入一个数值向量。由于类型不匹配,输入必须强制到IntegerVector,这意味着创建了一个副本,并且没有修改原始数值向量。比如说,

#include <Rcpp.h>

// [[Rcpp::export]]
void ones(Rcpp::IntegerVector x, int lx) {
   for (int i = 0; i < lx; i++) {
       x[i] = 1;
   }
}

/*** R

x <- rep(-1, 10)
class(x)
#[1] "numeric"

ones(x, length(x))
x
#[1] -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

y <- as.integer(rep(-1, 10)) # or, rep(-1L, 10)
class(y)
#[1] "integer"

ones(y, length(y))
y
#[1] 1 1 1 1 1 1 1 1 1 1

*/ 

我不知道RCPP,但是在C++中,为了传递一个引用,您需要:IngErthValth+X,而不是整数向量XI。如果我做了,我就不能访问x*的值。X[i],*x[i],*席和*席没有工作。我不知道RCPP,但是C++中为了传递一个引用,您需要:IngErthValth+X,而不是整数向量XI,如果我做了,我就不能访问x*的值。x[i]、*x[i]、*xi和*xi不起作用。我按照你的指示做了,但仍然不起作用:-我不确定这怎么可能。它显然有效,如上所示。@Coatless或者OP是非常不称职的…回答好-自动演员在扳手中抛出,所以@Coatless这一次是不正确的:&只是视觉上的糖分,因为我们处理的SEXP已经是指针了。不用担心。我们都掉进了那个洞里。一次、两次或多次。我遵循了你的指示,但仍然不起作用:-我真的不确定这怎么可能。它显然有效,如上所示。@Coatless或者OP是非常不称职的…回答好-自动演员在扳手中抛出,所以@Coatless这一次是不正确的:&只是视觉上的糖分,因为我们处理的SEXP已经是指针了。不用担心。我们都掉进了那个洞里。一次、两次或多次。
#include <Rcpp.h>

// [[Rcpp::export]]
void ones_numeric(Rcpp::NumericVector x, int lx) {
   for (int i = 0; i < lx; i++) {
       x[i] = 1.0;
   }
}

/*** R

z <- rep(-1, 10)
class(z) 
#[1] "numeric"

ones_numeric(z, length(z))
z
#1] 1 1 1 1 1 1 1 1 1 1

*/