交换两个SEXP而不进行复制

时间:2019-03-03 15:05:08

标签: r rcpp swap

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

Account Name   Duplicates
A001           A003, A004
A003           A001, A004
A004           A001, A003
A002           No duplicate

然后,如果我使用R运行此函数,x和y将被交换?

1 个答案:

答案 0 :(得分:5)

您的代码将不会交换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...