replace()与“ [<-”?

| 我最近偶然发现了
replace()
\"[<-\"
。它们似乎具有类似的功能,例如,使用ѭ1,我可以执行以下操作:
        > 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
\"[<-\"
有什么优势,反之亦然?     
已邀请:
        他们基本上是一回事。如果您查看replace的源代码,则会看到:
function (x, list, values) 
{
    x[list] <- values
    x
}
<environment: namespace:base>
所以replace只是is7ѭ的包装:
> replace(x.tst, s.tst==1, 0)
     [,1] [,2] [,3]
[1,]    0    0    5
[2,]    0    4    6
如果您需要执行一百万次操作,则使用
[<-
可以加快速度,因为您会丢失对包装函数的额外调用。但这确实是微不足道的,所以这是一个选择问题。我会说“ 0”更易读 顺便说一句,
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 
    

要回复问题请先登录注册