From marlin- at gmx.cn  Sun Mar 18 15:07:43 2018
From: marlin- at gmx.cn (Jialin Ma)
Date: Sun, 18 Mar 2018 22:07:43 +0800
Subject: [Rd] `@<-` modify its argument when slot is externalptr
Message-ID: <1521382063.7888.5.camel@gmx.cn>

Dear all,

I am confused about the inconsistent behaviors of `@<-` operator when
used in different ways. Consider the following example:

  library(inline)
  
  # Function to generate an externalptr object with random address
  new_extptr <- cfunction(c(), '
    SEXP val = PROTECT(ScalarLogical(1));
    SEXP out = PROTECT(R_MakeExternalPtr(&val, R_NilValue, val));
    UNPROTECT(2);
    return(out);
  ')

  setClass("S4ClassHoldingExtptr", contains = "externalptr")

  subs_extptr_1 <- function(x) {
    x at .xData <- new_extptr()
    x
  }

  subs_extptr_2 <- function(x) {
    x <- `@<-`(x, ".xData", new_extptr())
    x
  }

I expect functions "subs_extptr_1" and "subs_extptr_2" should be
semantically identical. (is it right?)

But it seems that "subs_extptr_2" will modify its argument while
"subs_extptr_1" won't.

  x <- new("S4ClassHoldingExtptr", new_extptr())
  y <- x
  y
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60971eb0>
  
  subs_extptr_1(x)
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60974250>
  x
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60971eb0>
  y
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60971eb0>

As shown above, "subs_extptr_1" will not modify x or y.

  subs_extptr_2(x)
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60973f30>
  x
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60973f30>
  y
   # An object of class "S4ClassHoldingExtptr"
   # <pointer: 0x7ffc60973f30>

However, "subs_extptr_2" will modify both x and y.

Is this behavior expected?

Thanks,
Jialin


> sessionInfo()
R version 3.4.1 (2017-06-30)
Platform: x86_64-suse-linux-gnu (64-bit)
Running under: openSUSE Tumbleweed

Matrix products: default
BLAS: /usr/lib64/R/lib/libRblas.so
LAPACK: /usr/lib64/R/lib/libRlapack.so

locale:
 [1] LC_CTYPE=en_US.UTF-
8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8       
 [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=en_US.UTF-
8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-
8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices
utils     datasets  methods   base     

other attached packages:
[1] inline_0.3.14 magrittr_1.5 

loaded via a namespace (and not attached):
[1] compiler_3.4.1 tools_3.4.1    yaml_2.1.18    ulimit_0.0-3



[Rd] `@<-` modify its argument when slot is externalptr
Jialin Ma