交换两个 SEXP 而不复制
Swap two SEXP without copying
使用 SEXP 作为函数的参数不允许用户通过简单的赋值在它们之间交换数据。我曾经用 tmp 缓冲区复制每个值来执行交换。
我的问题是:有可能编写一个只像这样交换数据的函数:
// [[Rcpp::export]]
void swap(SEXP x, SEXP y){
std::swap(x,y);
}
那么如果我 运行 这个函数与 R, x 和 y 将被交换 ?
您的代码不会交换 x
和 y
。
请注意,我们不需要 Rcpp 在不复制的情况下交换 x
和 y
。我们可以在直接 R 中完成,如下图所示。 x
最初的地址是 0x16d9fa08,y
最初的地址是 0x170291d8,交换后,在 R 中完成,它们的地址被交换,它们下面的所有内容都与最初与相同父地址关联的地址保持一致,即内容在原地址,未被复制
library(pryr)
x <- data.frame(a = 1:2)
y <- data.frame(y = 3:4)
inspect(x)
## <VECSXP 0x16d9fa08>
## <INTSXP 0x1459a5b0>
## attributes:
## <LISTSXP 0x1203a7c0>
## ...snip...
inspect(y)
## <VECSXP 0x170291d8>
## <INTSXP 0x12039288>
## attributes:
## <LISTSXP 0x14894a10>
## ...snip...
tmp <- x
x <- y
y <- tmp
inspect(x)
## <VECSXP 0x170291d8>
## <INTSXP 0x12039288>
## attributes:
## <LISTSXP 0x14894a10>
## ...snip...
inspect(y)
## <VECSXP 0x16d9fa08>
## <INTSXP 0x1459a5b0>
## attributes:
## <LISTSXP 0x1203a7c0>
## ...snip...
使用 SEXP 作为函数的参数不允许用户通过简单的赋值在它们之间交换数据。我曾经用 tmp 缓冲区复制每个值来执行交换。 我的问题是:有可能编写一个只像这样交换数据的函数:
// [[Rcpp::export]]
void swap(SEXP x, SEXP y){
std::swap(x,y);
}
那么如果我 运行 这个函数与 R, x 和 y 将被交换 ?
您的代码不会交换 x
和 y
。
请注意,我们不需要 Rcpp 在不复制的情况下交换 x
和 y
。我们可以在直接 R 中完成,如下图所示。 x
最初的地址是 0x16d9fa08,y
最初的地址是 0x170291d8,交换后,在 R 中完成,它们的地址被交换,它们下面的所有内容都与最初与相同父地址关联的地址保持一致,即内容在原地址,未被复制
library(pryr)
x <- data.frame(a = 1:2)
y <- data.frame(y = 3:4)
inspect(x)
## <VECSXP 0x16d9fa08>
## <INTSXP 0x1459a5b0>
## attributes:
## <LISTSXP 0x1203a7c0>
## ...snip...
inspect(y)
## <VECSXP 0x170291d8>
## <INTSXP 0x12039288>
## attributes:
## <LISTSXP 0x14894a10>
## ...snip...
tmp <- x
x <- y
y <- tmp
inspect(x)
## <VECSXP 0x170291d8>
## <INTSXP 0x12039288>
## attributes:
## <LISTSXP 0x14894a10>
## ...snip...
inspect(y)
## <VECSXP 0x16d9fa08>
## <INTSXP 0x1459a5b0>
## attributes:
## <LISTSXP 0x1203a7c0>
## ...snip...