将元素连接到 Rcpp 中 S4 类的插槽

Ian*_*Ian 7 r rcpp s4

考虑以下三个 Rcpp 函数:

void f(Rcpp::S4 A) {
  Rcpp::NumericVector x = A.slot("x");
  x[0] = 42;
}

void g(Rcpp::S4 A) {
  Rcpp::NumericVector x = A.slot("x");
  x.push_back(42);
}

void h(Rcpp::S4 A) {
  Rcpp::NumericVector x = A.slot("x");
  x.push_back(42);
  A.slot("x") = x;
}
Run Code Online (Sandbox Code Playgroud)

然后,将这些函数应用于 S4 类的实例,我得到:

> setClass(Class = "VectorClass", slots = list(x = "numeric"))
> A <- new("VectorClass", x = c(0))
> f(A)
> A
An object of class "VectorClass"
Slot "x":
[1] 42

> A <- new("VectorClass", x = c(0))
> g(A)
> A
An object of class "VectorClass"
Slot "x":
[1] 0

> A <- new("VectorClass", x = c(0))
> h(A)
> A
An object of class "VectorClass"
Slot "x":
[1]  0 42
Run Code Online (Sandbox Code Playgroud)

我的问题是

  • 函数的行为g是否正确?鉴于这样f的作品,我本来期望g修改插槽xA

  • 我假设h正在制作 的副本x,可能是在对push_back. 这个副本可以避免吗?有没有比 做事更好的方法h

谢谢!