【问题标题】:Swap two SEXP without copying在不复制的情况下交换两个 SEXP
【发布时间】:2019-03-03 15:05:07
【问题描述】:

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

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

} 

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

【问题讨论】:

  • 不,但你可以编写一个辅助函数来做。我不会在 std 命名空间中放置这样的助手,因为您想要的 SEXP 是非常 non 标准的,特定于 R 并且用 C 编写的。总之有一点不匹配在你的类型之间。
  • 我一直使用 std::copy 来进行快速复制,但这需要很多时间和空间。我也尝试交换符号,但它不起作用。

标签: r rcpp swap


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多