簡體   English   中英

function 中的 R 全局賦值運算符 - 還有什么更好的選擇?

[英]R Global assignment operator in a function - whats a better alternative?

我在 package 中有一個 function(目前主要供我自己使用,將來可能會分享)。 我正在嘗試用 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

所有這些都將在其父級多次調用的 function 中發生。

所以這(很多)更快。 但我的問題是

  1. 這樣做安全嗎?
  2. 是否有不使用<<-的類似快速替代方案?

使可變維度成為最后一個維度。 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))
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM