在下面的代码中,我编写了一个函数,其副作用是将向量的第一个条目更改为零。然后我生成一个名为“original”的向量,并制作一个名为“copy”的副本。如果我使用“copy”作为参数调用具有副作用的函数,“原始”也会改变!
我认为这是由R的内存管理引起的,“原始”在我对“复制”进行更改之前并未真正复制。并且R不知道函数sideEffect将改变输入,因此它不会产生真正的副本。任何人都可以证实这种理解吗?
其次,是否有一种优雅的方式可以迫使R制作真正的副本?通过不优雅,我的意思是像来回更改和进入“复制”。
第三,考虑到这一点我不能想到单个R函数有副作用,它是R中的编程范例吗?如果有的话我应该坚持它吗?
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
void sideEffect(NumericVector x) {
x(0) = 0;
}
/*** R
original <- 5
copy <- original
sideEffect(copy)
print(original) #prints 0
*/