我刚刚发现`[<-`
可能有破坏性副作用或不依赖于给出的参数。
示例
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
问:是否有通用方式可靠地防止破坏性行为,或至少防范它? (简而言之,完全避免`[<-`
。)
备注
我无法在文档中找到我的问题的答案(?`[<-`
);总的来说,我有一段时间在(?`...<-`
)上找到任何官方文档 - 键入“替换”操作符(我甚至不知道他们叫什么),以及没有解决副作用的问题。
当然,就我所知,即使我标记为“非破坏性”的行为,我仍然可能会有其他一些我不知道的副作用。
对于上面的简单示例,表达式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