如何保持`[<-`无副作用?

kjo*_*kjo 9 r side-effects

我刚刚发现它`[<-`可能具有破坏性的副作用,或者取决于它给出的参数.

x <- 1:5
x
# [1] 1 2 3 4 5
`[<-`(x, 1:5, 1)
# [1] 1 1 1 1 1
x
# [1] 1 2 3 4 5  # ? last application of `[<-` was non-destructive
`[<-`(x, 1:5, TRUE)
# [1] 1 1 1 1 1
x
# [1] 1 1 1 1 1  # ? the last application of `[<-` had a destructive side-effect
Run Code Online (Sandbox Code Playgroud)

问:是否有一个普遍可靠地防止破坏性的行为,或反对它至少后卫呢?(简而言之,`[<-`完全避免.)


笔记

  1. 我无法在文档(?`[<-`)中找到我的问题的答案; 一般来说,我有一段时间找到关于()类型"替换"操作符的任何官方文档?`...<-`(我甚至不知道它们被称为什么),并且没有一个正面解决副作用的问题.

  2. 当然,就我所知,即使是我称之为"非破坏性"的行为,也可能还有其他一些我不知道的副作用.

  3. 对于上面的简单示例,表达式as.logical(`[<-`(x, 1:5, 1))具有与其相同的值`[<-`(x, 1:5, TRUE),并保留相同的单行功能,但没有(明显的)副作用.然而,这种替代方案不是该问题的一般解决方案.


更新(响应BrodieG的要求)

$ R --quiet --no-save --no-restore
> x <- 1:5
> x
[1] 1 2 3 4 5
> `[<-`(x, 1:5, TRUE)
[1] 1 1 1 1 1
> x
[1] 1 1 1 1 1
> sessionInfo()
R version 3.3.1 (2016-06-21)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 8 (jessie)

locale:
 [1] LC_CTYPE=en_US.utf8       LC_NUMERIC=C             
 [3] LC_TIME=en_US.utf8        LC_COLLATE=en_US.utf8    
 [5] LC_MONETARY=en_US.utf8    LC_MESSAGES=en_US.utf8   
 [7] LC_PAPER=en_US.utf8       LC_NAME=C                
 [9] LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     
Run Code Online (Sandbox Code Playgroud)