gpt4 book ai didi

替换()与 "[<-"?

转载 作者:行者123 更新时间:2023-12-05 00:03:46 27 4
gpt4 key购买 nike

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

        > 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的优势是什么?对比 "[<-"反之亦然?

最佳答案

它们基本上是完全一样的。如果您查看替换的源代码,您会看到:

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

因此,replace 只是 [<- 周围的一个包装器。 :
> replace(x.tst, s.tst==1, 0)
[,1] [,2] [,3]
[1,] 0 0 5
[2,] 0 4 6

使用 [<-如果您需要执行此操作一百万次,则可以为您提供加速,因为您会丢失对包装器函数的额外调用。但它真的很边缘,所以这是一个选择的问题。我会说 replace()更易读

顺便说一句, 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

关于替换()与 "[<-"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com