模因使用universalmotif
包来简化使用主题元数据的工作。universalmotif
对象可以用另一种形式表示unviversalmotif_df
它允许用户像操作普通的R data.frame一样操作motif元数据(实际上,它们只是R data.frames)。
这些对象对于整理motif元数据以准备与模因一起使用的motif数据库或执行涉及motif的任何其他数据驱动任务非常有用。在这里,我描述了一种方法,可以使用这些数据结构来构建模因使用的主题数据库。
的MotifDb
软件包使它很容易从公共数据库查询成千上万的主题。在这里,我将描述如何使用其中一个查询作为模因函数的输入,以及如何操作生成的motif,以便为MEME套件工具准备它们。
我会用FlyFactorSurvey举个例子。可以从MotifDb
使用以下查询。
flyFactorDb < -MotifDb::MotifDb% > %MotifDb::查询(“FlyFactorSurvey”)#>参见system。文件("LICENSE", package="MotifDb")的使用限制。
使用universalmotif: convert_motifs ()
要转换MotifDb
查询到主题对象。在许多情况下,生成的列表可以直接用作模因函数的输入,例如runTomTom
,或runAme
.
但是这个数据库有一些问题。例如,下面的基序名称是FlyBase基因号,另一个名称是PWM的实际信息名称。MEME Suite在很大程度上依赖于主名称,因此如果数据库使用可解释的名称就更好了。
flyFactorMotifs% > %头(1)# > [[1]]# >#>主题名称:FBgn0259750替代名称:ab_SANGER_10_FBgn0259750#>生物:黑腹动物字母:DNA类型:PPM#>股:+-总IC: 15.01#>假计数:1#>共识:BWNRCCAGGWMCNNTNNNGNN目标站点:20个#>额外信息:[dataSource] FlyFactorSurvey# >#> b w n r c c a g g w m c n n t n n n n#> a 0.0 0.50 0.20 0.35 0 0 10 0 0.55 0.35 0.05 0.20 0.45 0.20 0.10 0.40 0.40#> c 0.3 0.15 0.25 0.00 1 10 00 0.10 0.65 0.70 0.45 0.25 0.10 0.25 0.25 0.10#> g 0.4 0.05 0.50 0.65 00 0 1 1 0.00 0.00 0.05 0.05 0.15 0.05 0.20 0.05 0.15#> t 0.3 0.30 0.05 0.00 00 00 00 0.35 0.00 0.20 0.30 0.15 0.65 0.45 0.30 0.35#> g n n#> a 0.25 0.50 0.30#> c 0.10 0.25 0.25#> g 0.55 0.15 0.45#> t 0.10 0.10 0.00
共有基序函数to_df ()
转换通用主题列表为universalmotif_df
可用于更新主题条目的格式。这在同时处理多个主题时特别有用。
的列universalmotif_df
可以自由更改编辑存储在主题
列。就像标准data.frames一样,可以添加额外的列来存储额外的元数据。有关这些对象的更多详细信息,请参阅帮助页:? universalmotif:: to_df
.
#可以更改以下列以更新主题元数据flyFactor_data% > %的名字#>[1]“motif”“name”“altname”“family”“有机体”#>[6] "共识" "字母表" "strand" "icscore" "nsites"#> [11] "bkgsites" "pval" "qval" "eval" "type"#> [16] "pseudocount" "bkg" "dataSource"
使用universalmotif_df
,我们可以很快看到FBgn数字的问题只适用于某些条目。数据库中由多个母题表示的tf被赋予相同的名称。使用主题数据库的MEME Suite工具(如TomTom和AME)要求条目具有唯一的主标识符,因此默认名称不合适。
flyFactor_data% > %头(5)#>主题名称altname有机体#> 1 FBgn0259750 ab_SANGER_10_FBgn0259750 Dmelanogaster #> 2 FBgn0259750 ab_SOLEXA_5_FBgn0259750 Dmelanogaster #> 3 abd-A Abd-A_FlyReg_FBgn0000014 Dmelanogaster #> 4 Abd-B Abd-B_FlyReg_FBgn0000015 Dmelanogaster #> 5 abd-A AbdA_Cell_FBgn0000014 Dmelanogaster #>一致字母链icscore nsites类型伪计数DNA +- 15.013759 20 PPM 11 . DNA +- 1#> 3 knmatwaw DNA +- 7.371641 37 PPM 1#> 4 ycataaaa DNA +- 7.831193 7 PPM 1#> 5 ttaatka DNA +- 8.976569 18 PPM 1#> bkg数据源#> 1 0.25, 0.....FlyFactorSurvey#> 2 0.25, 0.....FlyFactorSurvey#> 3 0.25, 0.....FlyFactorSurvey#> 4 0.25, 0.....FlyFactorSurvey#> 5 0.25, 0.....FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]
然而,altname
插槽从motifDb
查询已经是唯一的,因此可以将它们作为主名称。
一个简单的方法就是使用dplyr:重命名
交换列。
的的名字
列现在包含完整的主题名称。
flyFactor_data% > %头(3.)#>主题altname名称生物#> 1 * FBgn0259750 ab_SANGER_10_FBgn0259750 Dmelanogaster #> 2 * FBgn0259750 ab_SOLEXA_5_FBgn0259750 Dmelanogaster #> 3 * abd-A Abd-A_FlyReg_FBgn0000014 Dmelanogaster #>一致字母链icscore nsites类型伪计数DNA +- 15.013759 20 PPM 11 . DNA +- 1#> 3 knmatwaw DNA +- 7.371641 37 PPM 1#> bkg数据源#> 1 0.25, 0.....FlyFactorSurvey#> 2 0.25, 0.....FlyFactorSurvey#> 3 0.25, 0.....FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]#>[标有*的行被更改。]执行update_motifs()或to_list() to#>应用更改。
接下来解决FBgn的问题。FBgn编号是给定FlyBase参考组件中基因的唯一标识符。然而,FBgn数字随着时间的推移是不稳定的(即同一基因在参考组合之间可能有不同的FBgn数字),因此它们是确定正确基因符号的不可靠值。FlyBase.org有一个很好的转换工具可用于更新FBgn号码。
截至2021年3月撰写本文时,苍蝇因子调查数据库提供的FBgn条目已过时。为了演示整理motif元数据的方法示例,我将不使用FlyBase转换工具,而是强调一些在处理来自不同来源的motif数据库时可能更有用的方法。
对于本例,我们将尝试从motif名称中获取正确的基因名称,该名称存储在名称的第一个字段中,格式如下:"
我们使用tidyr:独立
来拆分第一个条目tifd
列,则只在altname包含FBgn时使用此值。
flyFactor_data% < > %#关键设置remove = FALSE以保留' name '列tidyr::单独的(姓名、c(“tfid”),删除=假,额外的=“下降”)% > %#只在altname包含FBgn时使用tfiddplyr::变异(altname =ifelse(grepl(“^ FBgn”), tfid, altname))
现在,前两个条目被列为“ab”而不是“FBgn0259750”。
flyFactor_data% > %头(3.)#>主题altname名称tfid有机体#> 1 * ab ab_SANGER_10_FBgn0259750 ab Dmelanogaster #> 2 * ab ab_SOLEXA_5_FBgn0259750 ab Dmelanogaster #> 3 * Abd- a Abd- a_flyreg_fbgn0000014 Abd Dmelanogaster #>一致字母链icscore nsites类型伪计数DNA +- 15.013759 20 PPM 11 . DNA +- 1#> 3 knmatwaw DNA +- 7.371641 37 PPM 1#> bkg数据源#> 1 0.25, 0.....FlyFactorSurvey#> 2 0.25, 0.....FlyFactorSurvey#> 3 0.25, 0.....FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]#>[标有*的行被更改。]执行update_motifs()或to_list() to#>应用更改。
接下来,因为FBgn已经过时了,我们将从“名称”中删除它们以缩短主题名称。类中的原母题名称更具有可比性FlyFactor调查.
值得一看的是altname
我们的解析tfid
不匹配。这是确保我们没有遗漏数据中任何重要边缘情况的好方法。当遇到新的边缘情况时,我们可以开发新的规则来整理数据,以确保高质量的主题集。
首先简单地筛选之间不匹配的所有实例altname
而且tfid
.
仔细比较altname
,的名字
,tfid
列。为什么这些值可能不同?有没有让你质疑数据的例子?
flyFactor_data% > %dplyr::过滤器(altname! =tfid)% > %为了简洁起见,我只展示了前5行,但看看完整的# data,看看你注意到了什么模式头(5)#>主题altname名称tfid有机体共识字母表#> 1 * Abd- a Abd- a_flyreg Abd Dmelanogaster KNMATWAW DNA #> 2 * Abd- b Abd- b_flyreg Abd Dmelanogaster YCATAAAA DNA #> 3 * abd-A AbdA_Cell AbdA Dmelanogaster TTAATKA DNA #> 4 * abd-A AbdA_SOLEXA AbdA Dmelanogaster NTTAATKR DNA #> 5 * Abd-B AbdB_Cell AbdB Dmelanogaster GWTTTATKA DNA #> strand icscore nsites type pseudocount bkg dataSource#> 1 +- 7.371641 37 PPM 1 0.25, 0.....FlyFactorSurvey#> 2 +- 7.831193 7 PPM 1 0.25, 0.....FlyFactorSurvey#> 3 +- 8.976569 18 PPM 1 0.25, 0.....FlyFactorSurvey#> 4 +- 8.330000 662 PPM 1 0.25, 0.....FlyFactorSurvey#> 5 +- 9.147674 21 PPM 1 0.25, 0.....FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]#>[标有*的行被更改。]执行update_motifs()或to_list() to#>应用更改。
有一件事变得很明显,那就是许多主题都不匹配altname
/tfid
值,因为大小写或连字符的差异。您可以使用特定于领域的知识来评估哪个是正确的。为果蝇例如,“abd-A”比“AbdA”正确。
在手动检查这些行之后,我确定不同的大小写、连字符或包含”的名称的实例。或“()”可以忽略。为了进一步研究数据,我将忽略大写和特殊字符的差异,如下所示:
flyFactor_data% > %#在两个列上调用ower()会删除大小写作为区别dplyr::过滤器(放低(altname)! =放低(tfid),#选择所有不包含“-”,“。”或“(”的替代名称!grepl(”——|\ \|。\ \(“altname),)% > %为了简洁起见,我将只可视化这些列dplyr::选择(altname, tfid, name, consensus)% > %头(10)#> altname tfid名称#> 1 da ac ac_da_SANGER_5 RCACCTGC#> 2 da amos amos_da_SANGER_10 rmaymtgbcv#> 3 da ase ase_da_SANGER_10 CACCTGY#> 4 da ato ato_da_SANGER_10 MCAYMTGNCRC#> 5 da ato ato_da_SANGER_5_2 GNCAKRTGN#> 6 da ato ato_da_SANGER_5_3 MCAYMTGNC#> 7 da cato cato_da_SANGER_10 MRCANMTGWC#> 8 Zif CG10267 CG10267_SANGER_5 WNYAACACTR9 Zif CG10267_SOLEXA_5 CNNNNWAYAACACTASNMNN10 mamo CG11071 CG11071_SANGER_5 YMMGCCTAYNNM# >#>[注:不完整的universalmotif_df对象。]
接下来,显而易见的是altnames
设置为“da”有很高的不匹配数tfid
例如,amos_da_SANGER_10
.当检查da的FlyFactorSurvey页面,结果表明该因子仅对应1个motif。检查阿莫斯的页面显示匹配amos_da_SANGER_10
.因此,我们可以得出结论,因子分配的名称达
是不正确的分配,我们应该更喜欢我们的解析tfid
.
现在我们已经处理了“da”不匹配,我们将它们过滤掉以识别新的特殊情况。
flyFactor_data% > %dplyr::过滤器(放低(altname)! =放低(tfid),!grepl(”——|\ \|。\ \(“, altname))% > %dplyr::选择(altname, tfid, name, consensus)% > %头(10)#> altname tfid名称#> 1 Zif CG10267 CG10267_SANGER_5 WNYAACACTR2 Zif CG10267_SOLEXA_5 CNNNNWAYAACACTASNMNN#> 3 mamo CG11071 CG11071_SANGER_5 YMMGCCTAYNNM#> 4 lms CG13424 CG13424_Cell NYTAATTR#> 5 lms CG13424 CG13424_SOLEXA_2 NNYTAATTRN#> 6 lms CG13424 CG13424_SOLEXA YTAATTR#> 7 erm CG31670 CG31670_SANGER_5 AAAWGMGCAWC# b31670 7 erm CG31670_SOLEXA_5 NNAAAWGAGCAAYNV#> 9 Spps CG5669 CG5669_SANGER_10 DRKGGGCGKGGCCAM#> 10 Spps CG5669 CG5669_SOLEXA_5 NGKGGGCGKGGCNWN# >#>[注:不完整的universalmotif_df对象。]
关于这些数据要注意的下一件事是,以“CG”为前缀的tfid条目经常不匹配。这是因为当进行FlyFactor调查时,许多基因是未命名的,因此从FlyBase分配了一个CG。随着时间的推移,一些CG被命名了。检查CG10267的FlyBase页面显示它已被重新命名为“Zif”。这与altname
,因此我们得出结论,具有“CG”的行tfid
可以安全地跳过他们吗altname
包含新的基因符号。
flyFactor_data% > %dplyr::过滤器(放低(altname)! =放低(tfid),!grepl(”——|\ \|。\ \(“altname),#排除CG基因!grepl(“CG\ \d +”tfid))% > %dplyr::选择(altname, tfid, name, consensus)#> altname tfid名称#> 1 cyc Clk Clk_cyc_SANGER_5 MCACGTGA#> 2 CG6272 Crc Crc_CG6272_SANGER_5 ATTACRTCABC#> 3最大dm dm_Max_SANGER_10 RNCACGTGGT#> 4 Clk gce gce_Clk_SANGER_5 GCCACGTG#> 5 Jra kay kay_Jra_SANGER_5 NATGASTCAYC#> 6 schlank Lag1 Lag1_Cell CYACYAAAWT#> 7 schlank Lag1 Lag1_SOLEXA CYACYAAWWT#> 8 Lim1 lim lim_SOLEXA_2 NNTAATTRV#> 9 Mnt Max Max_Mnt_SANGER_5 CCACGTG#> 10 Clk Met Met_Clk_SANGER_5 GACACGTG#> 11 bigmax Mio Mio_bigmax_SANGER_5 ATCACGTG#> 12 Bgb运行run_Bgb_NBT WAACCGCAR#> 13 Clk tai tai_Clk_SANGER_5 rcgtgtc#> 14 cyc tgo tgo_cyc_SANGER_5 GTCACGTGM#> 15 sim tgo tgo_sim_SANGER_5 GWACGTGACC#> 16 sima tgo tgo_sima_SANGER_5 GTACGTGAC#> 17 s tgo tgo_ss_SANGER_5 TGCGTGAC#> 18 tai tgo tgo_tai_SANGER_5 RCACGTGAC#> 19 trh tgo tgo_trh_SANGER_5 RTACGTGACC#> 20 CG6272 Xrp1_CG6272_SANGER_5# >#>[注:不完整的universalmotif_df对象。]
剩余的行(只有20个值)可以手动检查是否存在差异。我手工浏览了每一个条目,在上面查找它们的主题FlyFactor,以及它们的基因名称果蝇库来决定处理这些主题的最佳方式。有时,确保数据高质量的最佳方法是仔细检查数据!
我由此确定了一些altnames
需要交换,我将删除一个主题,因为它是不寻常的(Bgb有相同的主题吗运行但FlyFactor网站上的主题标记是“run”)。
我将对数据进行这些更改:
swap_alt_id < -c(“CG6272”,“时钟”,“马克斯”,“Mnt”,“Jra”)删除< -“Bgb”flyFactor_data% < > %dplyr::变异(altname =ifelse(altname%, %Swap_alt_id, tfid, altname))% > %dplyr::过滤器(!(altname%, %删除))
最后,根据我的手工检查,剩下的motif元数据也是OK的。
flyFactor_data% > %dplyr::过滤器(放低(altname)! =放低(tfid),!grepl(”——|\ \|。\ \(“altname),#排除CG基因!grepl(“CG\ \d +”tfid))% > %dplyr::选择(altname, tfid, name, consensus)#> altname tfid名称#> 1 cyc Clk Clk_cyc_SANGER_5 MCACGTGA#> 2 schlank Lag1 Lag1_Cell CYACYAAAWT#> 3 schlank Lag1 Lag1_SOLEXA CYACYAAWWT#> 4 Lim1 lim lim_SOLEXA_2 NNTAATTRV#> 5 bigmax Mio Mio_bigmax_SANGER_5 ATCACGTG#> 6 cyc tgo tgo_cyc_SANGER_5 GTCACGTGM#> 7 sim tgo tgo_sim_SANGER_5 GWACGTGACC#> 8 sima tgo tgo_sima_SANGER_5 GTACGTGAC#> 9 ss tgo tgo_ss_SANGER_5 TGCGTGAC#> 10 tai tgo tgo_tai_SANGER_5 RCACGTGAC#> 11 trh tgo tgo_trh_SANGER_5 RTACGTGACC# >#>[注:不完整的universalmotif_df对象。]
仅仅因为每个条目的元数据是唯一的,这并不意味着每个条目的主题矩阵是唯一的。有很多原因可以解释为什么两个不同的因素具有相同的主题:一些是生物学的,另一些是技术上的。在FlyFactorSurvey的情况下,一些条目在MotifDb中是不应该重复的。
例如,下面的主题是一个副本,其中整齐的元数据匹配:
flyFactor_data% > %dplyr::过滤器(共识= =“MMCACCTGYYV”)#>主题altname名称tfid有机体共识#> 1 * HLH54F HLH54F_da_SANGER_5 HLH54F Dmelanogaster MMCACCTGYYV #> 2 * HLH54F HLH54F_da_SANGER_5 HLH54F Dmelanogaster MMCACCTGYYV #>字母链icscore nsites类型伪计数bkg数据源#> 1 DNA +- 12.24152 23 PPM 1 0.25, 0.....FlyFactorSurvey#> 2 DNA +- 12.24152 23 PPM 1 0.25, 0.....FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]#>[标有*的行被更改。]执行update_motifs()或to_list() to#>应用更改。
在大型数据库中,很难以高通量的方式确定任何矩阵条目是否相同,并且并不总是可以依靠元数据来确定矩阵重复。
为了识别和去除重复的母题矩阵,模因提供了remove_duplicate_motifs ()
,它可以用来重复删除一个主题的列表仅基于他们的主题矩阵(即它忽略主题名称和其他元数据)。我们将使用此策略来重复删除flyFactor数据。
(注意:当使用其他motif数据库时,了解数据源以确定处理重复条目的适当措施是至关重要的。)
#此操作需要一段时间才能在大型主题列表上运行flyFactor_dedup < -remove_duplicate_motifs(flyFactor_data)#>警告在universalmotif::compare_motifs(x, method = "PCC"):一些比较#>失败,因为低motif IC
重复删除识别并删除57个相同的矩阵。
使用之前的例子,现在显示只有一个motif对应于这个序列。
flyFactor_dedup% > %dplyr::过滤器(共识= =“MMCACCTGYYV”)#>主题名称另类名称有机体共识字母表#> 1 #> strand icscore nsites type pseudocount bkg tfid数据源#> 1 +- 12.24152 23 PPM 1 0.25, 0.....HLH54F FlyFactorSurvey# >#>[隐藏的空列:家庭,bkgsites, pval, qval, eval.]
最后,现在数据库已经整理和重复数据删除,结果data.frame可以转换回一个universalmotif列表使用to_list ()
.方法删除所创建的附加列,以使它们不传递给universalmotif
,设置extrainfo = FALSE
.
# extrainfo = FALSE删除我们在数据清理期间添加的现在不需要的额外列flyFactorMotifs_final < -to_list(flyFactor_dedupextrainfo =假)#>丢弃未知槽位'tfid', 'dataSource' (set ' extrainfo=TRUE ')#>保存这些)。
生成的universalmotif列表对象现在反映了我们对data.frame
现在可以导出为.meme格式的文件使用universalmotif: write_meme
或者可以直接作为工具的输入runTomTom
或runAme
.
flyFactorMotifs_final% > %头(1)# > [[1]]# >主题名称:ab_SANGER_10#>替代名称:ab#>生物:黑腹动物字母:DNA类型:PPM#>股:+-总IC: 15.01#>假计数:1#>共识:BWNRCCAGGWMCNNTNNNGNN目标站点:20个# >#> b w n r c c a g g w m c n n t n n n n#> a 0.0 0.50 0.20 0.35 0 0 10 0 0.55 0.35 0.05 0.20 0.45 0.20 0.10 0.40 0.40#> c 0.3 0.15 0.25 0.00 1 10 00 0.10 0.65 0.70 0.45 0.25 0.10 0.25 0.25 0.10#> g 0.4 0.05 0.50 0.65 00 0 1 1 0.00 0.00 0.05 0.05 0.15 0.05 0.20 0.05 0.15#> t 0.3 0.30 0.05 0.00 00 00 00 0.35 0.00 0.20 0.30 0.15 0.65 0.45 0.30 0.35#> g n n#> a 0.25 0.50 0.30#> c 0.10 0.25 0.25#> g 0.55 0.15 0.45#> t 0.10 0.10 0.00
这个经过整理的FlyFactorSurvey数据中包含了模因执行(“extdata / flyFactorSurvey_cleaned。Meme ", package = "memes")
.
sessionInfo()#> R版本4.2.1 (2022-06-23)#>平台:x86_64-pc-linux-gnu(64位)运行在Ubuntu 20.04.5 LTS下# >矩阵产品:默认值#> BLAS: /home/biocbuild/bbs-3.16-bioc/R/lib/libRblas.so#> LAPACK: /home/biocbuild/bbs-3.16-bioc/R/lib/libRlapack.so# ># >语言环境:#> [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]统计图形grDevices utils数据集方法基础# >#>其他附加包:#> [1] universalmotif_1.16.0 magrittr_2.0.3 memes_1.6.0# >#>通过命名空间加载(并且没有附加):#> [1] Biobase_2.58.0 MatrixGenerics_1.10.0#> [3] sass_0.4.2 pkgload_1.3.1#> [5] tidyr_1.2.1 jsonlite_1.8.3#> [7] r . utis_2.12.1 bslib_0.4.0#> [9] brio_1.1.3 assertthat_0.2.1#> [11] highr_0.9 stats4_4.2.1#> [13] GenomeInfoDbData_1.2.9 Rsamtools_2.14.0#> [15] yaml_2.3.6 lattice_0.20-45#> [17] pillar_1.8.1 glue_1.6.2#> [19] digest_0.6.30 genome icranges_1 .50.0#> [21] XVector_0.38.0 colorspace_2.0-3#> [23] Matrix_1.5-1 htmltools_0.5.3#> [25] R.oo_1.25.0 XML_3.99-0.12#> [27] pkgconfig_2.0.3 ggseqlogo_0.1#> [29] zlibbioc_1.44.0 purrr_0.3.5#> [31] scales_1.2.1 tzdb_0.3.0#> [33] BiocParallel_1.32.0 tibble_3.1.8#> [35] generics_0.1.3 farver_2.1.1#> [37] IRanges_2.32.0 ggplot2_3.3.6#>[39]椭圆sis_0.3.2总结实验_1.28.0#> [41] cachem_1.0.6 with thr_2.5.0#> [43] BiocGenerics_0.44.0 cli_3.4.1#> [45] splitstackshape_1.4.8 crayon_1.5.2#> [47] evaluate_0.17 R.methodsS3_1.8.2#> [49] fansi_1.0.3 MASS_7.3-58.1#> [51] data.table_1.14.4 tools_4.2.1#> [53] hms_1.1.2 BiocIO_1.8.0#> [55] lifecycle_1.0.3 matrixStats_0.62.0#> [57] string_1 .4.1 S4Vectors_0.36.0#> [59] munsell_0.5.0 DelayedArray_0.24.0#> [61] Biostrings_2.66.0 compiler_4.2.1#> [63] jquerylib_0.1.4 GenomeInfoDb_1.34.0#> [65] rlang_1.0.6 MotifDb_1.40.0#> [67] grid_4.2.1 RCurl_1.98-1.9#> [69] rjson_0.2.21 bitops_1.0-7#> [71] rmarkdown_2.17 testthat_3.1.5#> [73] waldo_0.4.0 restfulr_0.0.15#> [75] gtable_0.3.1 codetools_0.2-18#> [77] dbi_1.1.3 r6_2.5.1#> [79] genome alignments_1.34.0 knitr_1.40#> [81] dplyr_1.0.10 rtracklayer_1.58.0#> [83] fastmap_1.1.0 utf8_1.2.2#> [85] rprojroot_2.0.3 cmdfun_1.0.2#> [87] readr_2.1.3 desc_1.4.2#> [89] stringi_1.7.8 parallel_4.2.1#> [91] Rcpp_1.0.9 vctrs_0.5.0#> [93] tidyselect_1.2.0 xfun_0.34