交换两个SEXP而无需复制

问题描述 投票:1回答:1

使用SEXP作为函数的参数不允许用户通过简单的分配在它们之间交换数据。我曾经用tmp缓冲区复制每个值来执行交换。我的问题是:编写一个只交换这样的数据的函数是有可能的:

// [[Rcpp::export]]
void  swap(SEXP x, SEXP y){
  std::swap(x,y);

} 

那么如果我用R运行这个函数,x和y会被交换吗?

r rcpp swap
1个回答
6
投票

你的代码不会交换xy

请注意,我们不需要Rcpp来交换xy而无需复制。我们可以在直线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...
© www.soinside.com 2019 - 2024. All rights reserved.