【问题标题】:Changing vector with a function in Rcpp [duplicate]使用 Rcpp 中的函数更改向量 [重复]
【发布时间】:2016-06-29 14:51:05
【问题描述】:

我在使用 Rcpp 中的简单代码时遇到问题。我的问题是我想通过将向量传递给函数来更改它。一个例子是:

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

当我在 R 中做时:

x = rep(-1, 10)
ones(x, length(x))

向量 x 不变。我怎样才能解决这个问题?

编辑: 如果我将 x 作为 &x 传递,我该如何更改它的值?

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

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

【问题讨论】:

  • 我不知道 rcpp,但在 c++ 中为了传递引用,您需要:“IntegerVector &x”而不是“IntegerVector x”
  • 如果我这样做,我无法访问 x 的值。 (*x)[i]、*x[i]、(*x)(i) 和 (*x)(i) 不起作用。

标签: r rcpp


【解决方案1】:

实际上,由于 Rcpp 类是代理对象,因此您可以在不通过引用的情况下执行此操作,但您必须准确地传递正确类型的向量。在你的函数签名中,x 是一个IntegerVector,但你传入了一个NumericVector,因为rep(-1, 10) 返回一个numeric,而不是integer。由于类型不匹配,必须将输入强制转换为 IntegerVector,这意味着创建了一个副本,并且原始(numeric 向量)修改。例如,

#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

*/ 

同样,如果 x 在您的函数签名中输入为 NumericVector,则不需要强制转换为 integer

#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

*/

【讨论】:

  • 我按照你的指示做了,但还是不行 :-(
  • 我不太确定这怎么可能。如上所示,它显然有效。
  • @Coatless 无论是那个还是 OP 都非常无能......
  • 很好的答案——自动转换会抛出扳手,所以@coatless 曾经是不正确的:&amp; 只是视觉上的糖,因为我们处理已经是指针的SEXP。跨度>
  • 不用担心。我们都掉进了那个洞。一次或两次或多次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2014-09-06
  • 1970-01-01
相关资源
最近更新 更多