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@.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 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel