2011-06-14 61 views
4

我最近偶然发现了replace()"[<-"。他们似乎有类似的功能,例如用"[<-"我可以做这样的事情:replace()vs“[< - ”?

 > 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 vs "[<-"有什么优势,反之亦然?

回答

7

他们基本上是完全一样的东西。如果你看一下更换的源代码,你会看到:

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

所以,取而代之的是不外乎围绕[<-的包装:

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

使用[<-如果你需要可以给你加速做这一百万次,因为你失去了对包装函数的额外调用。但它确实很小,所以这是一个选择问题。我会说replace()是多一点可读

btw,x.tst[s.tst==1] <- 0是比"[<-"(x.tst, s.tst==1, 0)更可读。没有理由使用该构造,除非您想将结果保存在新的数据框中。

澄清,正如@Andrie指出的那样,与replace()"[<-"(x.tst, s.tst==1, 0)一起,您将获得整个x.tst的副本并更改相关值。所以你可以把它放在一个新的对象中。这与x.tst[s.tst==1] <- 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

+1一个小的差异,我认为,是'取代(X,列表,...)'不修改X,而'X [名单] < - ...'会修改x。所以'替换'可以稍微不同。 – Andrie 2011-06-14 16:18:19

+2

噢。你们应该写一本书或其他东西! – 2011-06-14 16:20:30

+0

@Andrie:的确如此,@Andrie恰恰加入了答案 – 2011-06-14 16:27:46