内容

1概述

组织本地机器上的文件可能很麻烦。对于远程资源的本地副本来说尤其如此,这些副本可能定期需要重新下载以获得最新的可用信息。BiocFileCache用于帮助管理本地存储的本地和远程资源文件。它提供了一个方便的位置来组织文件,一旦添加到缓存管理中,该包提供了确定远程资源是否过期并需要重新下载的功能。

1.1安装与装载

BiocFileCache是一个Bioconductor包和可安装通过BiocManager:安装()

如果(!"BiocManager" %in% rownames(installed.packages()) install.packages("BiocManager") BiocManager::install("BiocFileCache", dependencies=TRUE)

软件包安装完成后,就可以加载到R工作空间的

库(BiocFileCache)

1.2创建/加载缓存

利用的第一步BiocFileCache在管理文件中是创建一个指定位置的缓存对象。我们将创建一个临时目录,用于本插图中的示例。如果在创建时未指定路径,则默认位置为目录~ /。BiocFileCache所定义的典型用户缓存目录工具::R_user_dir(“=“缓存”)

path <- tempfile() bfc <- BiocFileCache(path, ask = FALSE)

如果路径位置存在,并且之前已用于存储文件,则前一个对象将与保存到缓存中的任何文件一起加载。如果路径位置不存在,将提示用户创建新目录。如果会话没有交互式提示用户,或者用户决定不创建目录,则将使用临时目录。

检查缓存的一些实用函数是:

  • bfccache黄东海)
  • 长度(黄东海
  • 显示黄东海)
  • bfcinfo黄东海)

bfccache ()将显示缓存路径。请注意:因为我们正在使用临时目录,所以您的路径位置将与显示的不同。

bfccache(bfc) ## [1] "/tmp/Rtmp9rjNZa/file58a356bcd07d3"长度(bfc) ## [1] 0

长度()在BiocFileCache上将显示当前被跟踪的文件数量BiocFileCache.中存储内容的详细信息BiocFileCache对象中,有一个show方法,该方法将显示对象、对象类、缓存路径和当前正在跟踪的项的数量。

bfc ##类:BiocFileCache ## bfccache: /tmp/Rtmp9rjNZa/file58a356bcd07d3 ## bfccount: 0 ##更多信息参见:bfcinfo()或bfcquery()

bfcinfo ()会列出一个表的BiocFileCache在缓存中跟踪的资源文件。它返回一个dplyr类的对象tbl_sqlite

bfcinfo(bfc) ## #一个tibble: 0 × 10 ## #…与10个变量:rid , rname , create_time , ## # access_time , rpath , rtype , fpath , ## # last_modified_time , etag , expires 

资源文件表包括以下信息:

  • 资源id。自动生成。这是在将资源添加到缓存时自动生成的唯一标识符。
  • rname:资源名称。这是在将资源添加到缓存时由用户给出的。它不必是唯一的,可以随时更新。我们建议使用描述性关键字和标识符。
  • create_time:资源添加到缓存的日期和时间。
  • access_time:在缓存中使用资源的日期和时间。当资源更新或下载时,访问时间会更新。
  • rpath:资源路径。这是本地文件的路径。
  • rtype:资源类型。“local”或“web”,表示资源是否有远程来源。
  • fpath:如果rtype为“web”,这是到远端资源的链接。它将用于下载远程数据。
  • last_modified_time:对于远程资源,数据的本地副本的last_modified(如果可用)信息。根据远程资源检查此信息,以确定本地副本是否过时,是否需要更新。如果它不可用,或者您的资源不是远程资源,最后修改的时间将被标记为NA。
  • etag:对于远程资源,数据的本地副本的etag(如果可用)信息。根据远程资源检查此信息,以确定本地副本是否过时,是否需要更新。如果它不可用,或者您的资源不是远程资源,则etag将被标记为NA。
  • 到期:对于远程资源,数据的本地副本的过期信息(如果可用)。方法检查此信息Sys.time以确定是否需要更新本地副本。如果它不可用,或者您的资源不是远程资源,过期将被标记为NA。

现在我们已经创建了缓存对象和位置,让我们来研究一下添加缓存将管理的文件!

1.3添加/跟踪资源

现在BiocFileCache对象和缓存位置已创建,可以将文件添加到缓存中进行跟踪。有两个函数可以向缓存中添加资源:

  • bfcnew ()
  • bfcadd ()

选项之间的区别:bfcnew ()为资源创建条目并返回要保存到其中的文件路径。由于有多种类型的数据可以以多种不同的方式保存,bfcnew ()允许您保存任何R数据对象以适当的方式保存,并且仍然能够跟踪保存的文件。bfcadd ()应该在文件已经存在或正在访问远程资源时使用。

bfcnewBiocFileCache对象和指定的用户rname并返回要保存数据的路径位置。(可选)如果你知道要保存的文件类型,你可以添加文件扩展名:

savepath <- bfcnew(bfc, "NewResource", ext=". rdata ") savepath ## BFC1 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a35133eeb05_58a35133eeb05。RData" ## now we can use that path in any save function m = matrix(1:12, nrow=3) save(m, file=savepath) ## and that file will be tracked in the cache bfcinfo(bfc) ## # A tibble: 1 × 10 ## rid rname create_time access_time rpath rtype fpath last_modified_t… etag ##          ## 1 BFC1 NewRes… 2022-04-26… 2022-04-26… /tmp… rela… 58a3… NA  ## # … with 1 more variable: expires 

bfcadd ()用于现有文件或远程资源。用户仍然会指定一个rname他们的选择,但也必须指定路径,以本地文件或web资源为fpath.如果没有fpath给出时,默认是假设rname也是路径位置。如果fpath是本地文件,有几个选项由用户确定行动论点。行动是否允许用户选择复制将现有文件放入缓存目录,移动将现有文件放入缓存目录,或者将文件留在本地系统上的任何位置,但仍然跟踪缓存对象网络多媒体.复制和移动将把文件重命名为生成的缓存文件路径。如果fpath是远程源,源会尝试下载,如果下载成功,它会保存在缓存位置并在缓存对象中跟踪;原始源将添加到缓存信息为fpath.如果用户不希望最初下载远程资源,则参数下载= FALSE可用于延迟下载,但将资源添加到缓存。也可以使用相对路径位置,用Rtype = "relative".这将在缓存中存储文件的相对位置;只有行动复制而且移动可用于相对路径。

首先让我们使用本地文件:

Fl1 <- tempfile();file.create(fl1) ## [1] TRUE add2 <- bfcadd(bfc, "Test_addCopy", fl1) # copy #返回缓存中被跟踪的文件路径add2 ## BFC2 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a356961bfb3_file58a3529673baa" #名称是缓存中唯一的rid rid2 <- names(add2) fl2 <- tempfile();file.create(fl2) ## [1] TRUE add3 <- bfcadd(bfc, "Test2_addMove", fl2, action="move") # move rid3 <- names(add3) fl3 <- tempfile();file.create(fl3) ## [1] TRUE add4 <- bfcadd(bfc, "Test3_addAsis", fl3, rtype="local", action="asis") # reference rid4 <- names(add4) file.exists(fl1) # TRUE -从原始位置复制## [1]TRUE file.exists(fl2) # FALSE -从原始位置移动## [1]FALSE file.exists(fl3) # TRUE -左asis,原始位置跟踪## [1]TRUE

现在让我们添加一些远程源码的例子:

url <- "http://httpbin.org/get" add5 <- bfcadd(bfc, "TestWeb", fpath=url) rid5 <- names(add5) url2<- "https://en.wikipedia.org/wiki/Bioconductor" add6 <- bfcadd(bfc, "TestWeb", fpath=url2) rid6 <- names(add6) #添加远程资源但不初始下载add7 <- bfcadd(bfc, "TestNoDweb", fpath=url2, download=FALSE) rid7 <- names(add7) #让我们现在看看我们的BiocFileCache对象bfc ##类:BiocFileCache ## bfccache: /tmp/Rtmp9rjNZa/file58a356bcd07d3 ## bfccount:有关更多信息,请参阅:bfcinfo()或bfcquery() bfcinfo(bfc) ## #一个tibble:7×10 # #掉rname create_time access_time rpath rtype fpath last_modified_t…etag # # <空空的> <空空的> <空空的> <空空的> <空空的> <空空的> <空空的> <空空的> < >从而向# # 1 BFC1 NewRes……2022-04-26……2022-04-26……/ tmp…rela…58 a3…< NA > < NA > # # 2 BFC2 Test_a……2022-04-26……2022-04-26……/ tmp…rela…/ tmp…< NA > < NA > # # 3 BFC3 Test2_……2022-04-26……2022-04-26……/ tmp…rela…/ tmp…< NA > < NA > # # 4 BFC4 Test3_……2022-04-26……2022-04-26……/ tmp本地/ tmp…< NA > < NA > # # 5 BFC5 TestWeb 2022-04-26…2022-04-26…/ tmp…web的http…< NA > < NA > # # 6 BFC6TestWeb 2022-04-26…2022-04-14 14:0… ## 7 BFC7 TestNo…2022-04-26…2022-04-26…/tmp…web http…  ## #…with 1 more variable: expires  .

现在我们正在跟踪资源,让我们来探索如何访问它们的信息!

1.4资源调查/访问

在我们开始探索单个资源之前,有一个辅助函数。所提供的大多数函数都要求分配给资源的惟一rid[s]。的bfcadd而且bfcnew返回路径作为一个命名的字符向量,字符向量的名称是rid。但是,您可能希望访问一段时间前添加的资源。

  • bfcquery ()

bfcquery ()将在关键字和搜索rnamerpath,fpath对于任何匹配项。可以使用参数控制所搜索的列

bfcquery(bfc, "Web") ## # A tibble: 2 × 10 ## rid rname create_time access_time rpath rtype fpath last_modified_t…etag ##         ## 2 BFC6 TestWeb 2022-04-26…2022-04-26…/tmp…Web http…  ## #…rid , rname , create_time , ## # access_time , rpath , rtype , fpath , ## # last_modified_time , etag , expires  q1 <- bfcquery(bfc, "wiki") q1 ## #一个tibble:2 × 10 ## rid rname create_time access_time rpath rtype fpath last_modified_t…etag ##          ## 1 BFC6 TestWeb 2022-04-26…2022-04-26…2022-04-26…

如上图所示bfcquery (),返回类的对象tbl_sql并且可以利用这些类的方法(如包)进一步研究dplyr方法。的可以看出在表的第一列中要用到其他函数。若要快速统计缓存中与查询匹配的对象的数量,请使用bfccount ()

2 . Bfccount (q1) ## [1]

允许对BiocFileCache对象进行子集设置。输出将是一个BiocFileSubCache对象。用户仍然可以查询、删除(仅从子集对象中)和访问子集的资源,但是这些资源不能更新。

bfcsubWeb = bfc[paste0(" bfc ", 5:6)] bfcsubWeb ##类:BiocFileCacheReadOnly ## bfccache: /tmp/Rtmp9rjNZa/file58a356bcd07d3 ## bfccount: 2 ##更多信息请参见:bfcinfo()或bfcquery() bfcinfo(bfcsubWeb) ## #一个tibble:2 × 10 ## rid rname create_time access_time rpath rtype fpath last_modified_t…etag ##           ## 1 BFC5 TestWeb 2022-04-26…2022-04-26…/tmp…web http

有三种方法用于检索BiocFileCache资源路径位置。

  • [[
  • bfcpath ()
  • bfcrpath ()

[[将访问rpath保存在BiocFileCache.检索这个位置将返回资源本地版本的路径;允许用户在最适合该资源的任何加载/读取方法中使用此路径。的bfcpath ()而且bfcrpath ()两者都返回一个命名的字符向量,还显示可用于检索的本地文件。bfcpath需要ridbfcrpath ()可以使用ridrnames(但不是两者都有)。bfcrpath ()可以用来添加资源到缓存什么时候Rnames被指定;如果元素rnames未找到,它将尝试添加到缓存与bfcadd()”。

bfc[["BFC2"]] ## BFC2 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/ 58a356961bfb3_file58a356bcd07d3 / 58a356961bfb3_file58a356bcd07d3 /58a356961bfb3_file58a3529673baa" bfcpath(bfc, "BFC5") ## BFC5 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353834c19b_get" bfcrpath(bfc, rids="BFC5") ## BFC5 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353834c19b_get" bfcrpath(bfc, rids="BFC5") ## BFC5 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353834c19b_get" bfcrpath(bfc) ## BFC1 ## "/ Rtmp9rjNZa/file58a356bcd07d3/ 58a353834c19b_05 "/ Rtmp9rjNZa/file58a356bcd07d3/58a35133eeb05。"/tmp/Rtmp9rjNZa/file58a356bcd07d3/ 58a356961bfb3_file58a356bcd07d3 / 58a3554c5d9_file58a359d15de6 " ## BFC4 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353834c19b_get" ## BFC6 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a35622a799f_Bioconductor" ## BFC7 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/ 58a35622a356efe21b6_bioconductor "c("http://httpbin.org/get","Test3_addAsis")) ##添加rname 'http://httpbin.org/get' ## BFC4 ## "/tmp/Rtmp9rjNZa/file58a359d15de6" ## BFC8 ## # "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353ec480_get"

在本地管理远程资源涉及了解何时更新数据的本地副本。

  • bfcneedsupdate ()

bfcneedsupdate ()是一个方法,它将检查数据的etag和last_modified时间的本地副本到远程资源的etag和last_modified时间以及过期时间。缓存在最初添加web资源时保存此信息。过期时间是根据当前Sys。是时候查看本地资源是否过期了。如果是这样,资源将认为需要更新;如果不可用或未过期,将检查etag和last_modified_time。如果etag信息可用,则明确使用它,如果它不可用,则检查last_modified时间。如果资源也没有last_modified标记,则它是未确定的。如果资源还没有下载,就已经下载了真正的

注意:如果远程源代码过期,此函数不会自动下载。请参阅bfcdownload ()

bfcneedsupdate(bfc,“BFC5”)## BFC5 ## NA bfcneedsupdate(bfc,“BFC6”)## BFC6 ## TRUE bfcneedsupdate(bfc) ## BFC5 BFC6 BFC7 BFC8 ## NA TRUE TRUE NA

1.5更新资源项或远程数据的本地副本

就像你可以访问rpath,本地资源路径可设置为

  • [[< -

文件必须存在,才能在BiocFileCache.如果用户希望重命名,他们必须先复制(或触摸)文件。

filebeingreplace <- bfc[[rid3]] filebeingreplace ## BFC3 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/ 58a3554c5d9_file58a359d15de6 "当我们添加资源时创建了fl3 fl3 ## [1] "/tmp/Rtmp9rjNZa/file58a359d15de6" bfc[[rid3]]<-fl3 ##警告在' [[<- ' (' *tmp* ', rid3, value = "/tmp/Rtmp9rjNZa/file58a359d15de6"): ##更新rpath,更改rtype到'local' bfc[[rid3]] ## BFC3 ## "/tmp/Rtmp9rjNZa/file58a359d15de6"

用户也可能希望更改rnamefpath与资源相关联的rpath.这是可以做到的

  • bfcupdate ()

同样,如果改变rpath文件必须存在。如果一个fpath正在更新时,将下载数据,并提示用户覆盖中指定的当前文件rpath.如果用户不想被提示覆盖文件,问= FALSE可能会用到。

bfcinfo(bfc, "BFC1") ## # A tibble: 1 × 10 ## rid rname create_time access_time rpath rtype fpath last_modified_t…etag ##          ## 1 BFC1 NewRes…2022-04-26…2022-04-26…/tmp…rela…58a3…NA  ## ##…with 1 more variable: expires  bfcupdate(bfc, "BFC1", rname="FirstEntry") bfcinfo(bfc, "BFC1") ## # A tibble:1 × 10 rid rname create_time access_time rpath rtype fpath last_modified_t…etag ##          ## 1 BFC1 FirstE…2022-04-26…2022-04-26

现在让我们更新一个web资源

suppressPackageStartupMessages({library(dplyr)}) bfcinfo(bfc, "BFC6") %>% select(rid, rpath, fpath) ## # A tibble: 1 × 3 ## rid rpath fpath ##    ## 1 BFC6 /tmp/Rtmp9rjNZa/file58a356bcd07d3/58a35622a799f_Bioconductor https://en…bfcupdate(bfc, "BFC6", fpath=url, rname="Duplicate", ask=FALSE) bfcinfo(bfc, "BFC6") %>% select(rid, rpath, fpath) ## # A tibble:1 × 3 ## rid rpath fpath ##    ## 1 BFC6 /tmp/Rtmp9rjNZa/file58a356bcd07d3/58a35622a799f_Bioconductor http://htt…

最后,如果数据过期,远程资源可能需要更新(请参阅bfcneedsupdate ()).的bfcdownload函数将尝试从缓存中保存的原始资源下载为fpath并覆盖过期文件rpath

  • bfcdownload ()

下面的操作确认需要更新资源,并执行更新

rid <- "BFC5" test <- ! same (bfcneedsupdate(bfc, rid), FALSE) # 'TRUE' or 'NA' if (test) bfcdownload(bfc, rid, ask=FALSE) ## BFC5 ## "/tmp/Rtmp9rjNZa/file58a356bcd07d3/58a353834c19b_get"

1.6添加元数据

元数据提供了以下函数:

  • < - bfcmeta ()
  • bfcmeta ()
  • bfcmetalist ()
  • bfcmetaremove ()

可以将其他元数据添加为data.frames成为SQL数据库中的表。的data.frame必须包含列匹配列。然后,在访问缓存时将显示添加的任何元数据。元数据使用< - bfcmeta ().一个表的名字必须作为参数提供。用户可以添加多个元数据表,只要名称是唯一的。可以使用附加参数追加或覆盖表附加= TRUE覆盖= TRUE

names(bfcinfo(bfc)) ## [1] "rid" "rname" "create_time" ## [4] "access_time" "rpath" "rtype" ## [7] "fpath" "last_modified_time" "etag" ## [10] "expires" meta <- as.data.frame(list(rid=bfcrid(bfc)[1:3], idx=1:3)) bfcmeta(bfc, name="resourceData") <- meta names(bfcinfo(bfc)) ## [1] "rid" "rname" "create_time" ## [4] "access_time" "rpath" "rtype" ## [7] "fpath" "last_modified_time" "etag" ## [10] "expires" "idx"

可以使用列出已存在的元数据表bfcmetalist ()并且可以用bfcmeta ()

bfcmetalist(bfc) ## [1] "resourceData" bfcmeta(bfc, name="resourceData") ## rid idx ## 1 BFC1 1 ## 2 BFC2 2 ## 3 BFC3 3

最后,可以使用bfcmetaremove ()

bfcmetaremove(黄东海name = " resourceData ")

注意:

虽然所有函数的快速实现都存在,但如果您不指定BiocFileCache对象,它将对其进行操作BiocFileCache (),此选项不可用< - bfcmeta ().此函数必须始终指定一个BiocFileCache对象,方法是首先定义一个变量,然后将该变量传递给该函数。

ERROR的例子:

bfcmeta(name="resourceData") <- meta bfcmeta(name="resourceData")中的错误<- meta:赋值目标扩展到非语言对象

正确的实现:

bfc <- BiocFileCache() bfcmeta(bfc, name="resourceData") <- meta

所有其他函数都有默认值,如果BiocFileCache对象缺失,它将在默认缓存上操作BiocFileCache ()

1.7删除资源

现在我们已经添加了资源,也可以删除资源。

  • bfcremove ()

当您从缓存中删除资源时,它也将删除本地文件,但仅当它存储在给定的缓存目录中时bfccache黄东海).如果它是用户系统上其他位置的文件的路径,则只会从BiocFileCache对象,但文件未被删除。

#让我们提醒自己我们的对象bfc ##类:BiocFileCache ## bfccache: /tmp/Rtmp9rjNZa/file58a356bcd07d3 ## bfccount: 8 ##更多信息请参阅:bfcinfo()或bfcquery() bfcremove(bfc,“BFC6”)bfcremove(bfc,“BFC1”)#让我们现在看看我们的BiocFileCache对象bfc ##类:BiocFileCache ## bfccache: /tmp/Rtmp9rjNZa/file58a356bcd07d3 ## bfccount: 6 ##更多信息请参阅:bfcinfo()或bfcquery()

还有一个辅助函数可能会有用:

  • bfcsync ()

这个函数将比较两个东西:

  1. 如果有任何rpath无法找到(这将发生在bfcnew ()已使用,且未使用该路径保存对象)
  2. 如果缓存目录中有文件(bfccache黄东海)),并没有由BiocFileCache对象
#创建一个没有被使用的新条目path <- bfcnew(bfc, "UseMe") rmMe <- names(path) #我们也有一个文件没有被跟踪,因为我们更新了rpath bfcsync(bfc) ##条目没有相应的文件:'BFC7' 'BFC9' ##文件没有缓存条目## /tmp/Rtmp9rjNZa/file58a356bcd07d3/ 58a3554c5d9_file58a356bcd07d3 /add_or_return_rname。锁定## ## [1]FALSE #你可以抑制消息,只是有一个TRUE/FALSE bfcsync(bfc, FALSE) ## [1] FALSE ##让我们做一些清理,有一个同步对象# bfcremove(bfc, rmMe) unlink(filebeingreplace) bfcsync(bfc) ##条目没有相应的文件:'BFC7' ##文件没有缓存条目## /tmp/Rtmp9rjNZa/file58a356bcd07d3/add_or_return_rname。锁定## ## [1]false

1.8导出和导入缓存

有一个helper函数可以将BiocFileCache和相关文件导出为tar或zip归档文件,还有一个适当的导入函数。

  • exportbfc ()
  • importbfc ()

exportbfc函数将接收一个BiocFileCache对象或子集对象,并创建一个tar或zip存档,然后可以共享给不同计算机系统上的其他合作者。用户可以选择在哪里创建存档outputFile;当前工作目录和名称BiocFileCacheExport.tar默认使用。默认情况下创建tar存档,但用户可以使用参数创建zip存档outputMethod = " zip ".的任何附加参数跑龙套:邮政编码跑龙套:焦油也可以利用。

下面是一些调用示例:

# export整个biocfilecache exportbfc(bfc) #导出biocfilecache的前4个条目作为压缩的tar exportbfc(bfc, rids=paste0(" bfc ", 1:4), outputFile="BiocFileCacheExport.tar.gz", compression="gzip") #导出web资源的子集对象作为zip sub1 <- bfc[bfcrid(bfcquery(bfc, "web", field='rtype'))] exportbfc(sub1, outputFile=" BiocFileCacheExportWeb.zip", outMethod="zip")

存档一旦在用户系统上膨胀,将拥有发送缓存的完整功能副本。可以手动提取存档,并在构造函数中使用路径BiocFileCache ()或者为了方便起见importbfc可能被利用。的importbfc函数的参数为适当的tar或zip文件的路径archiveMethod指示如果解压解压缩应该使用(默认是untar),一个路径的存档应该提取到作为exdir的任何附加参数跑龙套:解压而且跑龙套:解压缩方法。该函数将提取文件并将相关的BiocFileCache对象加载到R会话中。

下面是加载上述示例导出对象的示例调用:

bfc <- importbfc("BiocFileCacheExport.tar") bfc2 <- importbfc("BiocFileCacheExport.tar.gz", compression="gzip") bfc3 <- importbfc("BiocFileCacheExportWeb.zip", archiveemethod ="unzip")

1.9从现有数据创建缓存

存在以下helper函数将现有数据转换为BiocFileCache:

  • makeBiocFileCacheFromDataFrame

如果有很多资源,这些函数可能需要一段时间才能运行,但是如果BiocFileCache存储在一个永久位置,它只需要运行一次。

1.9.1从一个现有的data.frame创建一个BiocFileCache

makeBiocFileCacheFromDataFrame获取一个现有的data.frame并创建一个BiocFileCache对象。缓存位置可以由缓存论点。的缓存必须不存在,用户将被提示创建位置。如果用户选择“N”,缓存将被创建在一个临时目录中,这个函数将不得不在一个新的R会话中再次运行。原始data.frame必须包含所需的BiocFileCache列rtyperpath,fpath如1.2节“创建/加载缓存”所述。可选列rnamelast_modified_timeetag而且到期也可以在原始data.frame中指定,尽管不是必需的,如果缺少将填充默认值。对于具有rtype = "地方",actionLocal将控制文件的本地副本是否被复制或移动到缓存位置,或者是否保留在本地系统上;如果资源标识为,则文件的本地副本必须存在rtype =当地.对于具有rtype = "网络"actionWeb将控制是否将远程文件的本地副本复制或移动到缓存位置。BiocFileCache要求所有远程资源将其本地副本下载到缓存位置。文件的本地副本不必存在,可以在以后将其下载到缓存中。除了必需的或可选的BiocFileCache列之外,原始data.frame的任何其他列都被分离出来,并作为元数据表添加到BiocFileCache中,其名称为metadataName.参见“添加元数据”的1.6节。

下面是一个data.frame的例子,其中包含最小列' rtype '、' rpath '和' fpath ',另外还有一个列将成为元数据' keywords '。“rpath”可以是NA由于这些是远程资源(rtype = '网络'),但尚未下载。

tbl <- data.frame(rtype=c("web","web"), rpath=c(NA_character_,NA_character_), fpath=c("http://httpbin.org/get", "https://en.wikipedia.org/wiki/Bioconductor"), keywords =c(" httpbin", "wiki"), stringsAsFactors=FALSE) tbl ## rtype rpath fpath keywords ## 1 web  http://httpbin.org/get httpbin ## 2 web  https://en.wikipedia.org/wiki/Bioconductor wiki
newbfc <- makeBiocFileCacheFromDataFrame(tbl, cache=file.path(tempdir(),"BFC"), actionWeb="copy", actionLocal="copy", metadataName=" resourcemetdata ")

1.10清理或移除缓存

最后,有两个函数涉及到清理或删除缓存:

  • cleanbfc ()
  • removebfc ()

cleanbfc ()将评估资源在BiocFileCache对象,并确定在指定天数内没有创建、重新下载或更新的文件(如果有的话)。如果问= TRUE,超过该阈值的每个条目将询问是否应该从缓存对象中删除它并删除文件(仅在bfccache黄东海)位置)。如果问= FALSE,它不会询问每个文件,并自动删除和删除文件。默认为120天。如果资源不需要任何更新,此函数可能会给出假阳性。它也没有考虑通过检索路径加载资源的时间。通过[[,bfcpath, bfcrpath),因此可能不能准确地指示资源的使用频率。请谨慎使用此功能。

cleanbfc黄东海)

removebfc ()将删除BiocFileCache从系统完成。保存在bfccache黄东海)目录也将被删除。

removebfc黄东海)

请注意请谨慎使用!

2用例

2.1internet资源的本地缓存

一种用途BiocFileCache是保存远程资源的本地副本。这种方法的好处包括可再现性、更快的访问速度以及访问(一旦缓存)不需要互联网连接。一个例子是Ensembl GTF文件(也可以通过[AnnotationHub][]获得)。

粘贴("ftp://ftp.ensembl.org/pub/release-71/gtf", "homo_sapiens/ homo_sapiens . grch37.71 .gtf.gz", sep="/")

对于系统级缓存,只需加载BiocFileCache打包并请求本地资源路径(rpath)的资源。

library(BiocFileCache) bfc <- BiocFileCache() path <- bfcrpath(bfc, url)

返回的路径bfcrpath ()如往常一样,

rtracklayer::import.gff(path)

更紧凑的用法,第一次或任何时候,是

gtf <- rtracklayer::import.gff(bfcrpath(BiocFileCache(), url))

集成发布不会随时间变化,因此不需要检查缓存的资源是否需要更新。

2.2实验计算的缓存

有人可能会用BiocFileCache缓存实验分析的结果。的rname字段提供了提供描述性元数据的机会,以帮助管理资源集合,而不依赖于神秘的文件命名约定。

在这里,我们在进行分析的目录中创建或使用本地文件缓存。

bfc <- BiocFileCache("~/my-experiment/results")

我们进行分析…

suppressPackageStartupMessages({library(DESeq2) library(airway)}) data(airway) dds <- DESeqDataData(airway, design = ~ cell + dex) result <- DESeq(dds)

然后将我们的结果保存到BiocFileCache

saveRDS(result, bfcnew(bfc, "气道/ DESeq标准分析"))

在稍后的日期检索结果

结果<- readRDS(bfcrpath(bfc, "气道/ DESeq标准分析"))

曾经可以想象如下的工作流程:

suppressPackageStartupMessages({库(BiocFileCache)库(rtracklayer)}) #加载缓存路径< - file.path (tempdir(),“tempCacheDir”)均< - BiocFileCache(路径)#感兴趣的web资源url < -“ftp://ftp.ensembl.org/pub/release-71/gtf/homo_sapiens/Homo_sapiens.GRCh37.71.gtf.gz”#检查是否被跟踪res < url - bfcquery(黄东海、url)如果(bfccount (res) = = 0 l){#如果它不在缓存中,添加ans < - bfcadd(黄东海rname =“运用,出头鸟”,fpath = url)其他}{#如果是在缓存,得到路径加载掉= res % > %过滤器(fpath = = url) % > %收集(正无穷 ) %>% `[[`(" 掉”)答< - bfcrpath(黄东海掉)#检查资源是否需要更新检查<——bfcneedsupdate(黄东海掉)#检查可以NA如果不能确定,选择如何处理如果(is.na(检查)检查< -如果(检查){ans <——bfcdownload(黄东海掉)}}# ans的路径文件加载ans #我们知道因为我们搜索文件的url是一个.gtf.gz,#如果我们搜索其他术语,我们可以使用'bfcpath'来查看#原始fpath,以了解适当的加载/读取/导入方法bfcpath(bfc, names(ans)) temp = GTFFile(ans) info = import(temp)
# #一个更简单的测试,看看是否有东西在缓存#,如果没有开始跟踪它是使用' bfcrpath ' # suppressPackageStartupMessages({library(BiocFileCache) library(rtracklayer)}) #加载缓存路径<- file.path(tempdir(), "tempCacheDir") bfc <- BiocFileCache(path,ask=FALSE) #感兴趣的web资源url <- "ftp://ftp.ensembl.org/pub/release-71/gtf/homo_sapiens/Homo_sapiens.GRCh37.71.gtf.gz" url2 <- "ftp://ftp.ensembl.org/pub/release-71/gtf/rattus_norvegicus/Rattus_norvegicus.Rnor_5.0.71.gtf.gz" #如果不在缓存中,将下载并创建新的条目pathsToLoad <- bfcrpath(bfc, c(url,添加rname url2) # # # #“ftp://ftp.ensembl.org/pub/release-71/gtf/homo_sapiens/Homo_sapiens.GRCh37.71.gtf.gz”添加rname ' ftp://ftp.ensembl.org/pub/release-71/gtf/rattus_norvegicus/Rattus_norvegicus.Rnor_5.0.71.gtf.gz ' pathsToLoad # # BFC1 # #“/ tmp / Rtmp9rjNZa / tempCacheDir / 58 a3532ed6375_homo_sapiens.grch37.71.gtf.gz“# # BFC2 # #“/ tmp / Rtmp9rjNZa / tempCacheDir / 58 a3555671fac_rattus_norvegicus.rnor_5.0.71.gtf.gz”#现在加载文件认为合适的信息=进口(GTFFile (pathsToLoad[1]))类(信息)# # [1]"GRanges" ## attr(,"package") ## [1] "GenomicRanges" summary(info) ## [1] "GRanges对象具有2253155个范围和12个元数据列"
# #一个人也可以想象如下:#库(BiocFileCache) #加载缓存bfc <- BiocFileCache() # #做一些工作!# #在缓存中添加一个位置filepath <- bfcnew(bfc, "R workspace") save(list = ls(), file=filepath) #现在R workspace在缓存中被跟踪

2.3缓存来管理包数据

包可能需要使用BiocFileCache来管理远程数据。下面的示例代码提供了一些最佳实践指南。

  1. 创建缓存

假设可以在代码、示例和小插图中的不同位置调用缓存。我们希望有一个BiocFileCache构造函数的包装器。下面是一个包的建议示例MyNewPackage

.get_cache <- function() {cache <- tools::R_user_dir("MyNewPackage", which="cache") BiocFileCache::BiocFileCache(cache)}

本质上,这将为包创建一个惟一的缓存。如果以交互方式运行,用户可以选择永久地创建包缓存,否则将使用临时目录。

  1. 缓存中的资源

管理远程资源涉及到一个函数,该函数将查询资源是否已添加,如果未添加,则将添加到缓存中,如果已添加,则检查文件是否需要更新。

download_data_file <- function(verbose = FALSE) {fileURL <- "http://a_path_to/someremotefile.tsv.gz" bfc <- .get_cache() rid <- bfcquery(bfc, "geneFileV2", "rname")$rid if(!length(rid)) {if(verbose) message("Downloading GENE file") rid <- names(bfcadd(bfc, "geneFileV2", fileURL))} if(!isFALSE(bfcneedsupdate(bfc, rid))) bfcdownload(bfc, rid) bfcrpath(bfc, rid = rid)}

2.4在缓存之前处理web资源

已经确定了一种情况,在将资源保存到缓存之前,可能需要对基于web的资源进行一些处理。的特定选项可以做到这一点bfcadd ()而且bfcdownload ()功能。

  1. 添加资源bfcadd ()使用下载= FALSE论点。
  2. 下载资源bfcdownload ()使用有趣的论点。

有趣的参数是在将下载的文件保存到缓存之前要应用的函数的名称。默认为file.rename,只需将下载的文件复制到高速缓存中。用户提供的函数只能接受两个参数。调用时,实参将是:

  1. 人物(1)包含从web检索到的资源的临时文件。
  2. 人物(1)处理后的文件应保存在BiocFileCache位置。

函数应该返回a真正的成功与否人物(1)错误失败的描述。举个例子:

< url -“//www.andersvercelli.com/packages/stats/bioc/BiocFileCache/BiocFileCache_stats.tab”headFile < #如何处理文件之前缓存功能(,){dat < - readline () writeline(头(dat))真正}掉<——bfcquery(黄东海、url、fpath)摆脱美元如果(!长度(去掉))#不在缓存中,添加但不要下载掉< -名字(bfcadd(黄东海、url下载= FALSE)更新< - bfcneedsupdate(黄东海掉)#真正的如果新添加的或陈旧的(! isFALSE(更新))# &下载过程bfcdownload(黄东海去掉,/tmp/Rtmp9rjNZa/tempCacheDir/58a353b9c0aa7_BiocFileCache_stats. ask = FALSE, FUN = headFile) ## BFC3 ## "tab" rpath <- bfcrpath(bfc, rids=rid) #路径到已处理结果readLines(rpath) #读取已处理结果##[1]"年\ t月\tNb_of_distinct_IPs\tNb_of_downloads" ## [2] "2022\tJan\t17480\t27986" ## [3] "2022\tFeb\t18891\t29016" ## [4] "2022\ tr \t13490\t20331" ## [6] "

注意:默认情况下,bfcadd使用webfile名称作为保存的本地文件。如果处理步骤涉及以不同格式保存数据,则使用bfcadd参数ext指定扩展名以识别所保存的文件类型。例如

url =" http://httpbin.org/get" bfcadd("myfile", url, download=FALSE) #将保存一个文件' _get '在缓存bfcadd("myfile", url, download=FALSE, ext=". rdata ") #将保存一个文件' _get。Rdata '在缓存中

3.组缓存访问

当希望在系统上的多个用户之间共享缓存时,可能会出现这种情况。这会出现权限错误。若要允许多个用户访问,请创建用户所属的组和缓存所属的组。可能是两个文件的权限需要根据您希望个人能够使用缓存完成的内容进行更改。只读缓存需要手动操作BiocFileCache.sqlite.LOCK,以便组权限为g + rw.为了允许用户将文件下载到共享缓存,BiocFileCache.sqlite. lock文件和BiocFileCache.sqlite. lock文件和BiocFileCache.sqlite. lock文件和BiocFileCache.sqlite. lock文件都可以下载到共享缓存。Sqlite文件将需要组权限g + rw.请谷歌如何为您感兴趣的系统创建用户组。要找到能够更改组和文件权限的缓存位置,如果使用默认位置,可以在R中运行以下命令:工具::R_user_dir(“BiocFileCache”=“缓存”)或者如果你创建了一个独特的位置,就像下面这样:bfc = BiocFileCache(cache="someUniquelocation");bfccache黄东海).为快速参考在linux你将使用乔恩currentuser: newgroup改变组和修改文件权限修改文件权限。chmod 660chmod g + rw应该完成正确的权限。

4锁文件

关于锁文件,经常报告两个问题。

4.1权限

可能会出现关于组和公共访问的权限错误。见上一节组缓存访问部分。

4.2无法锁定文件/没有可用的锁定

这是特定系统上文件锁的问题。特定的分区和非标准文件系统可能不支持filelock。解决方案是使用系统的不同部分来创建缓存。定义新缓存位置的最简单方法是使用环境变量。

R:

Sys。setenv(BFC_CACHE=<新缓存位置>)

或者,您可以全局设置环境变量,以避免必须在每个R会话中唯一地设置。请谷歌获取针对特定操作系统全局设置环境变量的具体说明。

其他常见的filelock实现包有特定的环境变量来控制位置:

  • BiocFileCache: BFC_CACHE
  • ExperimentHub: EXPERIMENT_HUB_CACHE
  • AnnotationHub: ANNOTATION_HUB_CACHE
  • biomaRt: BIOMART_CACHE

5总结

我们希望这个包可以更容易地管理本地和远程资源。

6默认缓存位置更新

从BiocFileCache版本> 1.15.1开始,默认缓存位置已经改变。默认缓存现在由函数控制工具::R_user_dir而不是rappdirs: user_cache_dir.使用了默认BiocFileCache位置的用户要继续使用创建的缓存,必须将缓存及其文件移动到新的默认位置或删除旧缓存,并必须重新下载以前的任何文件。

6.1选项1:移动文件

下面的步骤可以用来移动文件到新的位置:

  1. 在R中运行以下命令确定旧位置rappdirs: user_cache_dir(浏览器名称=“BiocFileCache”)

  2. 在R中运行以下命令确定新位置工具::R_user_dir(“BiocFileCache”=“缓存”)

  3. 将文件移动到新位置。您可以手动或在r中执行以下步骤。记住,如果您有很多缓存文件,这可能需要一段时间,并且您需要对所有文件具有权限才能移动它们。

#确保你对缓存/文件有权限#使用风险自承担moveFiles<-function(package){olddir <- path.expand(rappdirs::user_cache_dir(appname=package)) newdir <- tools::R_user_dir(package, which="cache") dir。create(path=newdir, recursive=TRUE) files <- list。files(olddir, full.names =TRUE)移动<- vapply(files, FUN=函数(fl){filename = basename(fl) newname =文件。路径(newdir, filename)文件。rename(fl, newname)}, FUN。VALUE = logical(1)) if(all(moves)) unlink(olddir, recursive=TRUE)} package="BiocFileCache" moveFiles(package)

6.2选项2:显式地指定缓存位置

属性可以始终指定唯一的缓存位置缓存参数指向BiocFileCache构造函数;但是,用户必须始终指定此位置,因为在默认情况下,在后续运行中将无法识别该位置。

或者,默认缓存位置也可以由用户或系统范围的环境变量控制。用户可以设置环境变量BFC_CACHE到旧位置继续使用作为默认位置。

6.3选项3:删除旧缓存

最后,如果用户不关心已经存在的默认缓存,那么旧位置可能会被删除,以使用新的默认位置向前移动。使用此选项时应谨慎。一旦删除,旧的缓存资源将不再可用,必须重新下载。

可以通过手动导航到ERROR消息中指示的位置as来完成此操作有问题的缓存:并删除文件夹及其所有内容。

通过R码可以进行如下删除:

谨慎这将删除旧的缓存和所有下载的资源。

BiocFileCache . library(BiocFileCache) package = "BiocFileCache" BFC_CACHE = rappdirs::user_cache_dir(appname=package)setenv(BFC_CACHE = BFC_CACHE) bfc = BiocFileCache(BFC_CACHE) ##注意:这将删除缓存和所有下载的资源removebfc(bfc, ask=FALSE) ##在新的默认位置创建新的空缓存bfc = BiocFileCache(ask=FALSE)

7SessionInfo

sessionInfo() ## R version 4.2.0 RC (2022-04-21 r82226) ##平台:x86_64-pc-linux-gnu(64位)##运行在:Ubuntu 20.04.4 LTS ## ##矩阵产品:默认## BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas。/home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack。所以## ## locale: ## [1] LC_CTYPE=en_US。UTF-8 LC_NUMERIC= c# # [3] LC_TIME=en_GB LC_COLLATE= c# # [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_phone = c# # [11] LC_MEASUREMENT=en_US。UTF-8 LC_IDENTIFICATION=C ## ##附加的基础包:## [1]stats4 stats graphics grDevices utils datasets methods ##[8]基础## ##其他附加包:## [1]rtracklayer_1.57.0 GenomicRanges_1.49.0 GenomeInfoDb_1.33.0 ## [4] IRanges_2.31.0 S4Vectors_0.35.0 BiocGenerics_0.43.0 ## [7] dplyr_1.0.8 BiocFileCache_2.5.0 dbplyr_2.1.1 ## [10] BiocStyle_2.25.0 ## ##通过命名空间加载(且未附加):# # # # [1] Rcpp_1.0.8.3 lattice_0.20-45 [3] Rsamtools_2.13.0 Biostrings_2.65.0 # # [5] assertthat_0.2.1 digest_0.6.29 # # [7] utf8_1.2.2 R6_2.5.1 # # [9] RSQLite_2.2.12 evaluate_0.15 # # [11] httr_1.4.2 pillar_1.7.0 # # [13] zlibbioc_1.43.0 rlang_1.0.2 # # [15] curl_4.3.2 jquerylib_0.1.4 # # [17] blob_1.2.3 Matrix_1.4-1 # # [19] rmarkdown_2.14 BiocParallel_1.31.0 # # [21] stringr_1.4.0 rcurl_1.98 - 1.6 # # [23] bit_4.0.4 DelayedArray_0.23.0 # # [25] compiler_4.2.0 xfun_0.30 # # [27] pkgconfig_2.0.3htmltools_0.5.2 # # [29] SummarizedExperiment_1.27.0 tidyselect_1.1.2 # # [31] tibble_3.1.6 GenomeInfoDbData_1.2.8 # # [33] bookdown_0.26 matrixStats_0.62.0 # # [35] xml_3.99 - 0.9 fansi_1.0.3 # # [37] crayon_1.5.1 withr_2.5.0 # # [39] GenomicAlignments_1.33.0 bitops_1.0-7 # # [41] rappdirs_0.3.3 grid_4.2.0 # # [43] jsonlite_1.8.0 lifecycle_1.0.1 # # [45] DBI_1.1.2 magrittr_2.0.3 # # [47] cli_3.3.0 stringi_1.7.6 # # [49] cachem_1.0.6 XVector_0.37.0 # # [51] bslib_0.3.1 ellipsis_0.3.2 # # [53] filelock_1.0.2[61] glue_1.6.2 purrr_0.3.4 ## [63] MatrixGenerics_1.9.0 parallel_4.2.0 ## [65] fastmap_1.1.0 yaml_2.3.5 ## [67] BiocManager_1.30.17 memoise_2.0.1 ## [69] knitr_1.38 sass_0.4.1 ## [71] BiocIO_1.7.0 .0 ## #