微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BiocParallel 无法通过函数持久化 data.table

如何解决BiocParallel 无法通过函数持久化 data.table

data.table 对象可以通过引用修改,并且在函数内部修改时不会重新创建。如果我用 data.table 修改 lapply 的列表,我就会有这种行为。但是,BiocParallel::bplapply 不会出现这种行为:

library(data.table)
l = list(data.table(x = letters[1:3],y = 1),data.table(x = letters[3:5],y = 2))
function1 <- function(DT){
  DT[x == "b",y := 10]
  function2(DT)
  invisible(NULL)
}

function2 <- function(DT){
  DT[x == "c",y := 100]
  invisible(NULL)
}
invisible(lapply(l,function(df) function1(df)))
l

[[1]]
   x   y
1: a   1
2: b  10
3: c 100

[[2]]
   x   y
1: c 100
2: d   2
3: e   2

使用 BiocParallel:

l = list(data.table(x = letters[1:3],y = 2))
library(BiocParallel)
BiocParallel::Multicoreparam()
invisible(BiocParallel::bplapply(l,function(df) function1(df)))
l

[[1]]
   x y
1: a 1
2: b 1
3: c 1

[[2]]
   x y
1: c 2
2: d 2
3: e 2

有没有办法在 BiocParallel 中修复它?

> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.7 LTS

Matrix products: default
BLAS:   /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  Grdevices utils     datasets  methods   base     

other attached packages:
[1] BiocParallel_1.22.0 data.table_1.13.4  

loaded via a namespace (and not attached):
[1] compiler_4.0.3 parallel_4.0.3 tools_4.0.3 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。