组织本地机器上的文件可能很麻烦。对于远程资源的本地副本来说尤其如此,这些副本可能定期需要重新下载以获得最新的可用信息。BiocFileCache用于帮助管理本地存储的本地和远程资源文件。它提供了一个方便的位置来组织文件,一旦添加到缓存管理中,该包提供了确定远程资源是否过期并需要重新下载的功能。
BiocFileCache
是一个Bioconductor包和可安装通过BiocManager:安装()
.
如果(!"BiocManager" %in% rownames(installed.packages()) install.packages("BiocManager") BiocManager::install("BiocFileCache", dependencies=TRUE)
软件包安装完成后,就可以加载到R工作空间的
库(BiocFileCache)
利用的第一步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。现在我们已经创建了缓存对象和位置,让我们来研究一下添加缓存将管理的文件!
现在BiocFileCache
对象和缓存位置已创建,可以将文件添加到缓存中进行跟踪。有两个函数可以向缓存中添加资源:
bfcnew ()
bfcadd ()
选项之间的区别:bfcnew ()
为资源创建条目并返回要保存到其中的文件路径。由于有多种类型的数据可以以多种不同的方式保存,bfcnew ()
允许您保存任何R数据对象以适当的方式保存,并且仍然能够跟踪保存的文件。bfcadd ()
应该在文件已经存在或正在访问远程资源时使用。
bfcnew
以BiocFileCache
对象和指定的用户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 .
现在我们正在跟踪资源,让我们来探索如何访问它们的信息!
在我们开始探索单个资源之前,有一个辅助函数。所提供的大多数函数都要求分配给资源的惟一rid[s]。的bfcadd
而且bfcnew
返回路径作为一个命名的字符向量,字符向量的名称是rid。但是,您可能希望访问一段时间前添加的资源。
bfcquery ()
bfcquery ()
将在关键字和搜索rname
,rpath
,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
需要rid
而bfcrpath ()
可以使用rid
或rnames
(但不是两者都有)。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
就像你可以访问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"
用户也可能希望更改rname
或fpath
与资源相关联的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"
元数据提供了以下函数:
< - 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 ()
.
现在我们已经添加了资源,也可以删除资源。
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 ()
这个函数将比较两个东西:
rpath
无法找到(这将发生在bfcnew ()
已使用,且未使用该路径保存对象)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
有一个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")
存在以下helper函数将现有数据转换为BiocFileCache:
makeBiocFileCacheFromDataFrame
如果有很多资源,这些函数可能需要一段时间才能运行,但是如果BiocFileCache存储在一个永久位置,它只需要运行一次。
makeBiocFileCacheFromDataFrame
获取一个现有的data.frame并创建一个BiocFileCache对象。缓存位置可以由缓存
论点。的缓存
必须不存在,用户将被提示创建位置。如果用户选择“N”,缓存将被创建在一个临时目录中,这个函数将不得不在一个新的R会话中再次运行。原始data.frame必须包含所需的BiocFileCache列rtype
,rpath
,fpath
如1.2节“创建/加载缓存”所述。可选列rname
,last_modified_time
,etag
而且到期
也可以在原始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 ")
最后,有两个函数涉及到清理或删除缓存:
cleanbfc ()
removebfc ()
cleanbfc ()
将评估资源在BiocFileCache
对象,并确定在指定天数内没有创建、重新下载或更新的文件(如果有的话)。如果问= TRUE
,超过该阈值的每个条目将询问是否应该从缓存对象中删除它并删除文件(仅在bfccache黄东海)
位置)。如果问= FALSE
,它不会询问每个文件,并自动删除和删除文件。默认为120天。如果资源不需要任何更新,此函数可能会给出假阳性。它也没有考虑通过检索路径加载资源的时间。通过[[,bfcpath, bfcrpath),因此可能不能准确地指示资源的使用频率。请谨慎使用此功能。
cleanbfc黄东海)
removebfc ()
将删除BiocFileCache
从系统完成。保存在bfccache黄东海)
目录也将被删除。
removebfc黄东海)
请注意请谨慎使用!
一种用途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))
集成发布不会随时间变化,因此不需要检查缓存的资源是否需要更新。
有人可能会用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在缓存中被跟踪
包可能需要使用BiocFileCache来管理远程数据。下面的示例代码提供了一些最佳实践指南。
假设可以在代码、示例和小插图中的不同位置调用缓存。我们希望有一个BiocFileCache构造函数的包装器。下面是一个包的建议示例MyNewPackage
:
.get_cache <- function() {cache <- tools::R_user_dir("MyNewPackage", which="cache") BiocFileCache::BiocFileCache(cache)}
本质上,这将为包创建一个惟一的缓存。如果以交互方式运行,用户可以选择永久地创建包缓存,否则将使用临时目录。
管理远程资源涉及到一个函数,该函数将查询资源是否已添加,如果未添加,则将添加到缓存中,如果已添加,则检查文件是否需要更新。
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)}
已经确定了一种情况,在将资源保存到缓存之前,可能需要对基于web的资源进行一些处理。的特定选项可以做到这一点bfcadd ()
而且bfcdownload ()
功能。
bfcadd ()
使用下载= FALSE
论点。bfcdownload ()
使用有趣的
论点。的有趣的
参数是在将下载的文件保存到缓存之前要应用的函数的名称。默认为file.rename
,只需将下载的文件复制到高速缓存中。用户提供的函数只能接受两个参数。调用时,实参将是:
人物(1)
包含从web检索到的资源的临时文件。人物(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 '在缓存中
当希望在系统上的多个用户之间共享缓存时,可能会出现这种情况。这会出现权限错误。若要允许多个用户访问,请创建用户所属的组和缓存所属的组。可能是两个文件的权限需要根据您希望个人能够使用缓存完成的内容进行更改。只读缓存需要手动操作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 660
或chmod g + rw
应该完成正确的权限。
关于锁文件,经常报告两个问题。
可能会出现关于组和公共访问的权限错误。见上一节组缓存访问
部分。
这是特定系统上文件锁的问题。特定的分区和非标准文件系统可能不支持filelock。解决方案是使用系统的不同部分来创建缓存。定义新缓存位置的最简单方法是使用环境变量。
R:
Sys。setenv(BFC_CACHE=<新缓存位置>)
或者,您可以全局设置环境变量,以避免必须在每个R会话中唯一地设置。请谷歌获取针对特定操作系统全局设置环境变量的具体说明。
其他常见的filelock实现包有特定的环境变量来控制位置:
我们希望这个包可以更容易地管理本地和远程资源。
从BiocFileCache版本> 1.15.1开始,默认缓存位置已经改变。默认缓存现在由函数控制工具::R_user_dir
而不是rappdirs: user_cache_dir
.使用了默认BiocFileCache位置的用户要继续使用创建的缓存,必须将缓存及其文件移动到新的默认位置或删除旧缓存,并必须重新下载以前的任何文件。
下面的步骤可以用来移动文件到新的位置:
在R中运行以下命令确定旧位置rappdirs: user_cache_dir(浏览器名称=“BiocFileCache”)
在R中运行以下命令确定新位置工具::R_user_dir(“BiocFileCache”=“缓存”)
将文件移动到新位置。您可以手动或在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)
属性可以始终指定唯一的缓存位置缓存
参数指向BiocFileCache构造函数;但是,用户必须始终指定此位置,因为在默认情况下,在后续运行中将无法识别该位置。
或者,默认缓存位置也可以由用户或系统范围的环境变量控制。用户可以设置环境变量BFC_CACHE
到旧位置继续使用作为默认位置。
最后,如果用户不关心已经存在的默认缓存,那么旧位置可能会被删除,以使用新的默认位置向前移动。使用此选项时应谨慎。一旦删除,旧的缓存资源将不再可用,必须重新下载。
可以通过手动导航到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)
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 ## #