【问题标题】:replace() vs "[<-"?替换()与“[<-”?
【发布时间】:2011-09-14 19:45:23
【问题描述】:

我最近偶然发现了replace()"[&lt;-"。它们似乎具有相似的功能,例如 "[&lt;-" 我可以这样做:

        > x.tst <- array(1:6, c(2,3))
        > s.tst <- array(0, c(2,3))
        > s.tst
             [,1] [,2] [,3]
        [1,]    0    0    0
        [2,]    0    0    0
        > s.tst[1:3] <- 1
        > "[<-"(x.tst, s.tst==1, 0)
             [,1] [,2] [,3]
        [1,]    0    0    5
        [2,]    0    4    6
        > x.tst
             [,1] [,2] [,3]
        [1,]    1    3    5
        [2,]    2    4    6

有人可以帮助澄清差异吗? replace"[&lt;-" 的优势是什么?反之亦然?

【问题讨论】:

    标签: r variable-assignment


    【解决方案1】:

    它们基本上完全相同。如果你查看替换的源代码,你会看到:

    function (x, list, values) 
    {
        x[list] <- values
        x
    }
    <environment: namespace:base>
    

    所以 replace 只不过是 [&lt;- 的一个包装器:

    > replace(x.tst, s.tst==1, 0)
         [,1] [,2] [,3]
    [1,]    0    0    5
    [2,]    0    4    6
    

    如果您需要执行此操作一百万次,使用[&lt;- 可以加快速度,因为您会丢失对包装函数的额外调用。但这确实是边缘化的,所以这是一个选择问题。我想说replace()更易读

    顺便说一句,x.tst[s.tst==1] &lt;- 0"[&lt;-"(x.tst, s.tst==1, 0) 更具可读性。没有理由使用该构造,除非您想将结果保存在新的数据框中。

    澄清一下,正如@Andrie 指出的那样,replace()"[&lt;-"(x.tst, s.tst==1, 0) 都会得到整个 x.tst 的副本,其中相关值已更改。所以你可以把它放在一个新的对象中。这与x.tst[s.tst==1] &lt;- 0 相反,您可以在其中更改 x.tst 本身的值。请注意,它不会节省内存,因为 R 会在执行操作之前在内部制作 x.tst 的副本。

    计时结果:

    > system.time(replicate(1e6, replace(x.tst, s.tst==1, 0)))
       user  system elapsed 
      12.73    0.03   12.78 
    
    > system.time(replicate(1e6, "[<-"(x.tst, s.tst==1, 0)))
       user  system elapsed 
       6.42    0.02    6.44 
    
    > system.time(replicate(1e6, x.tst[s.tst==1] <- 0))
       user  system elapsed 
       5.28    0.02    5.32 
    

    【讨论】:

    • +1 我认为一个小区别是replace(x, list, ...) 不会修改x,而x[list] &lt;- ... 会修改x。所以replace 的用法可以稍有不同。
    • 哇。你们应该写一本书什么的!
    • @Andrie :确实,添加到答案中
    • @Joris Meys 令人惊讶的是,经常查看源代码有助于澄清问题。谢谢!
    • IMO 其实一点也不神奇
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2012-03-14
    • 2011-06-25
    相关资源
    最近更新 更多