Поменяйте местами два SEXP без копирования - PullRequest
0 голосов
/ 03 марта 2019

Использование SEXP в качестве аргумента функции не позволяет пользователю обмениваться данными между ними простым присваиванием.Я использовал для копирования каждого значения с помощью буфера TMP для выполнения подкачки.Мой вопрос: есть возможность написать функцию, которая обменивается только данными:

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

} 

Тогда, если я запусту эту функцию с R, x и y поменяются местами?

1 Ответ

0 голосов
/ 03 марта 2019

Ваш код не поменяет местами 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...
...