【问题标题】:Rcpp: Storing elements to subset of vectorRcpp:将元素存储到向量的子集
【发布时间】:2020-10-07 21:18:17
【问题描述】:

我仍在思考来自 R 上下文的 Rcpp 逻辑,所以请耐心等待!来自以下代码:

Cjplus <- c(0,0)
Kseq <- c(1,2)
cand <- c(0,1)
cppFunction("NumericVector test(NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector A = as<NumericVector>(Cjplus[Kseq-1]);
  int B = cand[i-2];
  as<NumericVector>(Cjplus[Kseq-1]) = A + B;
  return Cjplus[Kseq-1];
}")
test(Cjplus, Kseq, cand, 3)

我希望得到 [1] 1 1 作为我的输出,但我得到了 [1] 0 0。我在这里的索引是否不正确?

【问题讨论】:

  • 一般来说,您不应该一次做太多事情(在您的示例子集分配和添加一个向量和一个带有回收的整数)。如果您打算修改它们,您还应该始终copy 输入值。否则,您的函数会修改通过引用传递的值(在您的示例中为 Cjplus)作为副作用。并且应该避免副作用,除非它们是为了性能优化和精心管理。
  • 嗯——坦率地说,“你来自哪里”并不重要,重要的是你要了解编译和静态链接语言的工作方式,这完全不同。有很多非常好的 C++ 书籍(C++ 上的 StackOverflow resource list优秀)。看一眼您的代码,您会误将 -1 从值和位置中取出。也许打印一些更多的调试语句(并切换到sourceCpp()——更容易编辑)。
  • 我添加了一个子集赋值示例。

标签: r rcpp


【解决方案1】:

我不明白您为什么尝试使用子集分配。

Cjplus <- c(0,0)
Kseq <- c(1,2)
cand <- c(0,1)

cppFunction("NumericVector test(NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector A = Cjplus[Kseq-1];
  double B = cand[i-2];
  A = A + B;
  return A;
}")
test(Cjplus, Kseq, cand, 3)
#[1] 1 1

编辑:

这是一个执行子集分配的版本。

library(Rcpp)
cppFunction("NumericVector test(const NumericVector Cjplus, NumericVector Kseq,
                   NumericVector cand, int i) {
  NumericVector C = clone(Cjplus);
  NumericVector A = C[Kseq-1];
  double B = cand[i-2];
  A = A + B;
  C[Kseq-1] = A;
  return C;
}")
test(Cjplus, Kseq, cand, 3)
#[1] 1 1

【讨论】:

  • 感谢您提供这两个版本!这对我理解如何在 C++ 中做 R 中相当基本的事情非常有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多