Rcpp:将元素存储到向量的子集
我仍然在思考来自R上下文的Rcpp逻辑,所以请耐心等待我!从以下代码:Rcpp:将元素存储到向量的子集,r,rcpp,R,Rcpp,我仍然在思考来自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<Numer
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)
Cjplus我不明白您为什么尝试使用子集赋值
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
一般来说,您不应该一次做太多的事情(在您的示例中,子集赋值和向量与整数的相加是循环的)。如果要修改输入值,也应始终复制输入值。否则,函数会修改通过引用传递的值(在示例中为Cjplus
)作为副作用。应该避免副作用,除非这些副作用是为了性能优化和精心管理。坦率地说,“你从哪里来”并不重要,重要的是你了解编译语言和静态链接语言是如何工作的,这是完全不同的。有很多非常好的C++书籍(而且C++是很好的)。浏览代码时,您会错误地从值中减去-1,从位置中减去-1。也许可以打印更多的调试语句(并切换到sourceCpp()
,以便于编辑)。我添加了一个subset-assignment示例。感谢您提供这两个版本!这对我理解C++中的R是如何基本的有帮助。