考虑以下三个 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修改插槽x的A。
我假设h正在制作 的副本x,可能是在对push_back. 这个副本可以避免吗?有没有比 做事更好的方法h?
谢谢!