2011-06-14 74 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

相關問題