它们基本上是完全相同的东西。如果你查看replace的源代码,你会看到:
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
Using [<-
如果您需要执行此操作一百万次,则可以加快速度,因为您将失去对包装函数的额外调用。但这确实是微不足道的,所以这是一个选择的问题。我会这样说replace()
更具可读性
Btw, x.tst[s.tst==1] <- 0
比"[<-"(x.tst, s.tst==1, 0)
。没有理由使用该构造,除非您想将结果保存在新的数据框中。
为了澄清,正如 @Andrie 指出的,两者都replace()
and "[<-"(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