gpt4 book ai didi

R 函数中的全局赋值运算符 - 什么是更好的选择?

转载 作者:行者123 更新时间:2023-12-04 09:10:06 24 4
gpt4 key购买 nike

我在一个包中有一个函数(目前主要供我自己使用,将来可能会分享)。我正在尝试用 lapply 替换一个缓慢的 for 循环,以便稍后我可以并行化它。因此,我发现即使没有并行化也非常快的一种选择是使用全局赋值运算符。但是我对此感到焦虑,因为这似乎令人不悦,而且我不习惯考虑环境,因此担心副作用:
这是一个简单的reprex:



n <- 2
nx <- 40
v <- 5
d <- 3

array4d <- array(rep(0, n * nx * v * d) ,
dim = c(n, nx, v, d) )
array4d2 <- array4d

# Make some data to enter into the array - in real problem a function gens this data depending on input vars

set.seed(4)
dummy_output <- lapply(1:v, function(i) runif(n*nx*d))

microbenchmark::microbenchmark( {
for(i in 1:v){
array4d[ , , i, ] <- dummy_output[[i]]
}
}, {
lapply(1: v, function(i) {
array4d2[ , , i, ] <<- dummy_output[[i]]
})
})

Unit: microseconds
expr min lq
{ for (i in 1:v) { array4d[, , i, ] <- dummy_output[[i]] } } 1183.504 1273.6205
{ lapply(1:v, function(i) { array4d2[, , i, ] <<- dummy_output[[i]] }) } 13.257 16.1715
mean median uq max neval cld
1488.26909 1411.4565 1515.762 3535.974 100 b
33.56976 18.1445 21.150 1525.608 100 a
>
> identical(array4d, array4d2)
[1] TRUE
所有这些都将在其父函数多次调用的函数中发生。
所以这是(很多!)更快。
但我的问题是
  • 这样做安全吗?
  • 是否有不使用 <<- 的类似快速替代方案?
  • 最佳答案

    使变化的维度成为最后一个。 microbenchmark 表明它的性能与使用全局变量的性能没有统计学差异。如果维度是第三个很重要,请使用 aperm(x, c(1, 2, 4, 3))然后。

    microbenchmark::microbenchmark( 
    a = for(i in 1:v) array4d[ , , i, ] <- dummy_output[[i]],
    b = lapply(1: v, function(i) array4d2[ , , i, ] <<- dummy_output[[i]]),
    c = array(unlist(dummy_output), dim(array4d3))
    )

    关于R 函数中的全局赋值运算符 - 什么是更好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63367022/

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