【发布时间】: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()——更容易编辑)。 -
我添加了一个子集赋值示例。