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

标签 r variable-assignment assignment-operator

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

这是一个简单的表示:



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

所有这些都将发生在一个被其父函数多次调用的函数内。

所以这(很多!)更快。 但我的问题是

  1. 这样做安全吗?
  2. 是否有不使用 <<- 的类似快速替代方案?

最佳答案

将变化的维度设为最后一个。微基准测试表明,其性能与使用全局变量的性能在统计上没有差异。如果尺寸是第三个很重要,请使用 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/

相关文章:

mysql - SQL 或 R : Find and display the index of all '1' s from a column with binary data type and store in another 1 or more columns

ruby - 迭代数组以在 ruby​​ 中创建变量

c++ - 派生类继承基类赋值运算符?

c++ - 了解使用C++赋值时的运算符 “less”或 “greater”

arrays - 如何快速求解R中的多个方程?

r - 从 do.call 内部调用时,R/Rstudio 中的调试浏览器崩溃

r - 如何在一张覆盖有透明度的条形图上绘制两个字符变量的频率

c++ 变量赋值,这是一种正常的方式吗..?

ios - 随机选择一个 socket 并设置其他 socket

c - 是 a[i]=y++; a[i++]=y;未定义的行为或未在 C 语言中指定?