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

时间:2017-04-14 13:53:04

标签: 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

问:是否有通用方式可靠地防止破坏性行为,或至少防范它? (简而言之,完全避免`[<-`。)

备注

  1. 我无法在文档中找到我的问题的答案(?`[<-`);总的来说,我有一段时间在(?`...<-`)上找到任何官方文档 - 键入“替换”操作符(我甚至不知道他们叫什么),以及没有解决副作用的问题。

  2. 当然,就我所知,即使我标记为“非破坏性”的行为,我仍然可能会有其他一些我不知道的副作用。

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

  4. 更新(响应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     
    

0 个答案:

没有答案