与InteractionSet交互类基因交互数据

包:InteractionSet
作者:亚伦Lun (alun@wehi.edu.au)
编制日期:2019-10-29

介绍

最近开发的技术,如高c和ChIA-PET驱动基因相互作用的研究,即、物理之间的相互作用对基因组区域。的InteractionSet包提供类来表示这些交互,来存储相关的实验数据。目的是为包开发者提供稳定的类定义,可以通过大量的操纵方法。bob电竞体育官网它还为用户提供了一个一致的接口在不同的包,使用相同的类,使其更容易与多个包进行分析。

三个类都可以从这个包:

这个描述将每个类及其相关方法的简要描述。

的描述GInteractions

建设

GInteractions类商店任意数量的两两之间的相互作用两个基因组区域。区域本身是由一个表示农庄对象的GenomicRanges包中。例如,假设我们有一个all.regions对象包含连续区间(虽然可以使用任何地区,连续间隔只是简单解释):

all.regions<- GRanges("chrA", IRanges(0:9*10+1, 1:10*10))

现在,假设我们有一大堆的元素之间的交互all.regions。我们将考虑三个两两之间的相互作用——一个地区# 1和# 3、# 5和# 2之间的另一个,最后10 #和# 6之间。这三个交互可以表示:

索引。1 < - c(1、5、10)指数。2 < - c(3 2 6)地区。1 < - all.regions[索引。1)区域。2 < - all.regions [index.2]

建设GInteractions对象可以通过提供执行互动区域:

胃肠道< - GInteractions(地区。1,region.2)

这生成一个GInteractions长度为3的对象,每个条目对应于一个两两交互。或者,指标可以直接提供,连同他们的坐标区域指:

胃肠道< GInteractions(指数。1、指数。2,所有。地区)胃肠道
与3 # # GInteractions对象交互和0元数据列:# # seqnames1 ranges1 seqnames2 ranges2 # # < Rle > < IRanges > < Rle > < IRanges > # # [1] chrA 1 - 10 - - - chrA 21 - 30 # # [2] chrA每周——chrA 11日至20日# # [3]chrA 91 - 100——chrA 51-60 # # - - - - - - - # #区域:10 # # seqinfo范围和0元数据列:1从一个未指明的基因组序列;没有seqlengths

请注意,农庄不存储单独为每个交互。相反,一个共同的农庄对象中使用GInteractions对象。每个交互简单存储索引点两组常见相关间隔,代表地区的交互。这是因为,在许多情况下,相同的间隔重复使用不同的交互,例如,高c数据的常见垃圾箱,常见的山峰ChIA-PET数据。存储索引,而不是重复农庄条目保存记忆在最后表示。

getter

互动区域被称为锚地区,因为他们“锚”的互动(把它们像杯子在一连串电话)。这些锚区域可以访问,有趣的是,方法:

主持人(gi)
# #美元第一次与3和0 # #农庄组织对象元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA每周[3]chrA 91 - 100 * # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths # # # #美元第二# #农庄与3和0元数据对象列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 21 - 30 * * # # # # [2] chrA 11日至20日[3]chrA 51-60 * # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths

这返回一个GRangesList长度为2的,th之间的相互作用th地区的第一个第二个。我们也可以获得农庄第一或第二个锚地区本身,通过指定type = "第一"“第二”,分别。或者,我们可以直接通过设置每个相互作用的指标id = TRUE:

主持人(gi, id = TRUE)
# #第一# #[1]1美元5 10 # # # # $ s # # [1] 3 2 6

常见的集合区域,这些指数点可以获得的地区方法:

区域(gi)
与10 # #农庄对象范围和0元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA 11日至20日[3]chrA 21 - 30 * # # [4] chrA 31-40 * # # [5] chrA每周* # # [6]chrA 51-60 * # # [7] chrA 61 - 70 * # # [8] chrA 71 - 80 * # # [9] chrA 81 - 90 * # # [10] chrA 91 - 100 * # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths

从开发人员的角度来看,这是非常有用的,因为它通常是更高效的操作指标和地区分开。例如,常见的操作可以应用到的输出区域(gi),与锚指数相关的检索结果。这通常是速度比应用那些操作重复区域的实例主持人(gi)。还要注意,区域(gi)自动排序——这是在执行GInteractions类,和执行的一致性。(锚指数同样适应占这个排序,所以指标提供给构造函数返回的可能不一样。)

最后,值得指出的是,GInteractions对象继承自向量基类的S4Vectors包,随后访问它的所有方法。例如,可以使用访问元数据元数据方法,而interaction-specific元数据可以与访问mcols方法。为了方便起见,特定的字段mcols也可以直接访问的美元操作符。

setter

修改一个现有的锚GInteractions对象可以执行通过提供新的锚指数。例如,下面的代码结构的三个两两交互地区之间# 1和# 5;# 2和# 6之间;和# 3和# 7之间。

temp.gi < - gi anchorIds (temp.gi) < -列表(1:3,前书5章7节)

这个替代方法可能不会得到太多的使用,因为它通常会减少困惑构造一个新的GInteractions对象。尽管如此,它提供以防需要(和避免黑客的插槽)。

修改常见的地区是对大多数人来说可能更有用。最典型的应用程序将与一些元数据注释区域,例如,GC内容,围绕基因,是否这是一个启动子或增强子:

temp.gi < - gi注释< -代表(c (“E”、“P”、“N”), length.out =长度(all.regions))地区(temp.gi)美元庵野< -注释

这将显示当锚区域检索:

主持人(temp.gi)
# #美元第一# #农庄与3和1元数据列对象:# # seqnames范围链|庵野# # < Rle > < IRanges > < Rle > | <人物> # # [1]chrA E - 10 * | # # [2] chrA每周P * | # # [3] chrA 91 - 100 E * | # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths # # # #美元第二# #农庄与3和1元数据列对象:# # seqnames范围链|庵野# # < Rle > < IRanges > < Rle > | <人物> # # [1]chrA 21 - 30 N * | # # [2] chrA 11日至20日P * | # # [3] chrA 51-60 N * | # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths

可以替换现有的公共区域使用的超集replaceRegions方法。这可能是有用的,例如,在这种情况下,我们想使锚指标指向正确的条目在一组更大的地区。

temp.gi < - gi超级。地区<- GRanges("chrA", IRanges(0:19*10+1, 1:20*10)) replaceRegions(temp.gi) <- super.regions

另外,其他地区可以直接添加到组常见的appendRegions方法。这是一个比打电话更有效一些replaceRegions额外的连接区域与现有常见的设置。

额外temp.gi < - gi。地区<- GRanges("chrA", IRanges(10:19*10+1, 11:20*10)) appendRegions(temp.gi) <- extra.regions

最后,推导向量意味着我们可以设置一些元数据字段。例如,通用元数据可以倾倒GInteractions对象使用元数据方法:

元数据(gi) < - $描述“我GInteractions对象”的元数据(gi)
# # # #元描述[1]“我GInteractions对象”

也可以存储通过Interaction-specific元数据mcols替代方法或通过美元包装。一个应用程序可能会存储每个互动有趣的相关指标,如标准化联系频率:

set.seed (1000) norm.freq < - rnorm(长度(gi) #显然,这些都不是真正的频率。胃肠道norm.freq < - norm.freq mcols (gi)
# # DataFrame 1 3行和列# # norm.freq # -0.445778264836677 # <数字> # # 1 # # -1.2058565689643 # # 3至0.0411263138456899点

构造子集,结合

构造子集的GInteractions将返回一个新的对象只包含指定的交互:

sub.gi < - gi [1:2] sub.gi
1与2 # # GInteractions对象交互和元数据列:# # seqnames1 ranges1 seqnames2 ranges2 | norm.freq # # < Rle > < IRanges > < Rle > < IRanges > | <数字> # # [1]chrA 1 - 10 - - - chrA 21 - 30 | -0.445778264836677 # # [2] chrA每周——chrA 11日至20日| -1.2058565689643 # # - - - - - - - # #区域:10 # # seqinfo范围和0元数据列:1从一个未指明的基因组序列;没有seqlengths
锚(子。胃肠道,id = TRUE)
# #第一# #[1]1美元5 # # # #第二# #美元[1]3 2

注意,公共区域修改的构造子集GInteractions对象。构造子集只影响的交互,即。,的anchor indices, not the regions to which those indices point.

相同的(区域(gi)、区域(sub.gi))
# # [1]

对象也可以连接使用c。这形成了一个新的GInteractions对象包含所有交互的组成对象。这两种方法还将与不同的工作对象共同区域,最后一组公共的区域形成一个联盟的组成集。

sub.gi c (gi)
与5 # # GInteractions对象交互和1元数据列:# # seqnames1 ranges1 seqnames2 ranges2 | norm.freq # # < Rle > < IRanges > < Rle > < IRanges > | <数字> # # [1]chrA 1 - 10 - - - chrA 21 - 30 | -0.445778264836677 # # [2] chrA每周——chrA 11日至20日| -1.2058565689643 # # [3]chrA 91 - 100——chrA 51-60 | 0.0411263138456899 # # [4] chrA 1 - 10 - - - chrA 21 - 30 | -0.445778264836677 # # [5] chrA每周——chrA 11日至20日| -1.2058565689643 # # - - - - - - - # #区域:10 # # seqinfo范围和0元数据列:1从一个未指明的基因组序列;没有seqlengths
新的。胃肠道<- gi regions(new.gi) <- resize(regions(new.gi), width=20) c(gi, new.gi)
与6 # # GInteractions对象交互和1元数据列:# # seqnames1 ranges1 seqnames2 ranges2 | norm.freq # # < Rle > < IRanges > < Rle > < IRanges > | <数字> # # [1]chrA 1 - 10 - - - chrA 21 - 30 | -0.445778264836677 # # [2] chrA每周——chrA 11日至20日| -1.2058565689643 # # [3]chrA 91 - 100——chrA 51-60 | 0.0411263138456899 # # [4] chrA 1 - - - - - - - chrA意向| -0.445778264836677 # # [5]chrA 41-60——chrA 11-30 | -1.2058565689643 # # [6] chrA 91 - 110——chrA 51 - 70 | 0.0411263138456899 # # - - - - - - - # #区域:20 # # seqinfo范围和0元数据列:1从一个未指明的基因组序列;没有seqlengths

排序、复制和匹配

在我们开始之前,我们做一个稍微复杂的对象,所以我们得到更多有趣的结果。

新的。胃肠道<- gi anchorIds(new.gi) <- list(1:3, 5:7) combined <- c(gi, new.gi)

swapAnchors方法应用来确保第一个锚指数总是小于第二个锚指数为每个交互。这就消除了冗余的排列锚区域并确保之间的交互区域# 1和# 2是一样的对待地区# 2和# 1之间的交互。显然,这假设冗余的排列是无趣的,也明白了StrictGInteractions下面,这是一个更加方便。

结合< - swapAnchors(组合)

的顺序GInteractions对象使用锚指标执行。具体来说,交互命令,这样第一个锚指数增加。任何与相同的第一个锚索引命令的第二索引。

订单(组合)
# # 1 4 2 5 6 3 [1]
< -排序排序(组合)锚(分类、id = TRUE)
# # $第一# #[1]1 1 2 2 3 6 # # # # # #[1]3 5美元5 6 7 10

回想一下,公共区域已经在每个分类GInteractions对象。这意味着锚指数相当于排序的排序在锚地区本身。在下面的示例中,锚区域内排序正确排序的对象。

主持人(分类、类型=“第一”)
与6 # #农庄对象范围和0元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * # # [2] chrA 1 - 10 * # # [3] chrA 11日至20日* * # # # # [4]chrA 11日至20日[5]chrA 21 - 30 * # # [6] chrA 51-60 * # # - - - - - - - # # seqinfo: 1从一个未指明的基因组序列;没有seqlengths

重复的相互作用被认为是那些有相同的双锚指数。在下面的示例中,所有的重复条目翻了一倍被标记为重复。的独特的方法返回一个GInteractions对象中删除所有重复的条目。

翻了一倍< - c(结合,结合)重复(翻倍)
# #[1]假假假假假假真的真的真的真的真的# # [12]

相同也可以匹配之间的交互GInteractions对象。我们强迫排列一致的格式swapAnchors对象之间的比较。的匹配方法然后查找条目在第二个对象相同的锚指数作为第一对象中的每个条目。显然,常见的地区必须相同这是明智的。

anchorIds (new.gi) < -(4:6 - 1:3)新列表。胃肠道< - swapAnchors (new.gi)交换。胃肠道<- swapAnchors(gi) match(new.gi, swap.gi)
2 # # [1]NA NA

最后,GInteractions对象可以以类似的方式进行比较。这决定了th交互对象=th其他对象交互。再次,公共区域的对象应该是一样的。

new.gi = = swap.gi
# #[1]假真的假的

距离计算

我们经常感兴趣的互动区域线性基因组之间的距离,可以确定一个互动是本地或远端。这些距离可以很容易地获得pairdist方法。为了说明这一点,让我们构建一些相互作用涉及多个染色体:

all.regions<- GRanges(rep(c("chrA", "chrB"), c(10, 5)), IRanges(c(0:9*10+1, 0:4*5+1), c(1:10*10, 1:5*5))) index.1 <- c(5, 15, 3, 12, 9, 10) index.2 <- c(1, 5, 11, 13, 7, 4) gi <- GInteractions(index.1, index.2, all.regions)

默认情况下,pairdist返回锚的中点之间的距离为每个区域互动。不会有任何inter-chromosomal交互定义距离沿着线性基因组,所以NA而不是返回。

pairdist (gi)
# # 40 NA NA 5 20 60 [1]

不同类型的距离可以通过指定类型参数,例如,“差距”,“跨越”,“对角线”。此外,一个交互是否intra-chromosomal与否可以决定的intrachr功能:

intrachr (gi)
# #[1]真的假假的真的真的真的

重叠的方法

锚之间的重叠在一维可以确定区域和一个线性基因间隔。说我们想确定所有交互与至少一个锚地区躺在一个感兴趣的区域(例如,一个已知的启动子或基因)。这可以完成了findOverlaps方法:

of.interest < -农庄(“chrA IRanges (30、60)) olap < - findOverlaps olap (gi, of.interest)
# #打击对象4支安打,0元数据列:# # queryHits subjectHits # # <整数> <整数> # # 1 # # [2][1]1 2 1 # # 1 # # [4][3]3 6 1 # # - - - - - - - # # queryLength: 6 / subjectLength: 1

这返回一个支安打对象包含双指数,每一对代表一个重叠之间的交互(查询)与基因区间(主题)。这里,每个交互报道至少有一个锚区域重叠在指定的时间间隔of.interest:

主持人(gi (queryHits (olap)])
# #美元第一# #农庄组织对象列:4和0元数据链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA每周* # # [2]chrB 21 - 25日* # # [3]chrA 21 - 30 * # # [4] chrA 91 - 100 * # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths # # # #美元第二# #农庄对象列:4和0元数据链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA每周[3]chrB 1 - 5 * # # [4] chrA 31-40 * # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

农庄可以指定如果有几个感兴趣的区域。可以提供的标准参数findOverlaps修改其行为,例如,类型,minoverlap。的use.region参数可以设置为指定地区GInteractions对象重叠。的overlapsAny,countOverlapssubsetByOverlaps方法也可以按预期和行为。

一个更复杂的情况包括识别重叠在二维交互空间的交互。说我们有两个区域共用现有的交互,由一个表示GInteractions对象命名paired.interest。我们要确定我们的任何“新”的相互作用胃肠道与现有的交互重叠,例如,确定相应的数据集之间的相互作用。特别是,我们只考虑一个重叠如果每个锚定新的交互重叠区域对应的锚地区现有的交互。说明:

paired.interest < - GInteractions (of.interest农庄(“chrB IRanges (10, 40)))
# # .Seqinfo警告。mergexy (x, y): 2组合对象没有序列水平共同之处。(使用# # suppressWarnings()压制这个警告。)
olap < - findOverlaps olap (gi, paired.interest)
# #打击对象1,0元数据列:# # queryHits subjectHits # # <整数> <整数> # # [1]1 # 2 # - - - - - - - # # queryLength: 6 / subjectLength: 1

现有的互动paired.interest发生之间的一个间隔染色体上(例如,of.interest)和另一个b染色体上的相互作用胃肠道,只有胃肠道[2]被认为是重叠的,尽管一些交互1 d重叠of.interest。这是因为只有胃肠道[2]有一个锚区域与伴随的重叠与互动合作伙伴区域b染色体上,参数可以提供findOverlaps调整自己的行为。的overlapsAny,countOverlapssubsetByOverlaps方法也可以为这些二维重叠。

连接的区域

一个稍微不同的问题涉及到发现交互链接在两套地区任何条目。例如,我们可能会感兴趣确定一组基因之间的相互作用和增强剂。使用findOverlaps进行二维重叠将是乏味的,因为我们需要手动指定每一个可能的gene-enhancer组合。相反,我们的目标可以实现使用linkOverlaps功能:

all.genes<- GRanges("chrA", IRanges(0:9*10, 1:10*10)) all.enhancers <- GRanges("chrB", IRanges(0:9*10, 1:10*10)) out <- linkOverlaps(gi, all.genes, all.enhancers) head(out)
# # DataFrame 4行3列# #查询subject1 subject2 # # <整数> <整数> <整数> # # 1 2 5 3 # # 2 2 6 3 # # 3 3 3 1 # # 4 3 4 1

这将返回一个数据帧,每一行物种的交互查询,该区域重叠subject1(即。,的gene), and the overlapping region insubject2(即。,的enhancer). If there are multiple overlaps to either set, all combinations of two overlapping regions are reported. One can also identify interactions within a single set by doing:

< - linkOverlaps (gi all.genes)头()
# #与# # 6行和3列查询DataFrame subject1 subject2 # # <整数> <整数> <整数> # # 1 1 5 1 # # 2 5 2 # # 3 1 6 1 # # 4 1 9 6 2 # # 5 5 5 9 8 7 # # 6

在这里,两个subject1subject2参考相关条目all.genes

找到边界框

组的相互作用可以概括通过识别最小边界框。这是指最小的矩形可以包含所有交互互动空间。我们可以节省边界框的坐标,而不必处理个人的协调互动。为了说明这一点,我们将建立一个基于染色体配对分组向量:

所有人。chrs <- as.character(seqnames(regions(gi))) group.by.chr <- paste0(all.chrs[anchors(gi, type="first", id=TRUE)], "+", all.chrs[anchors(gi, type="second", id=TRUE)])

边界框识别可以执行使用boundingBox函数。对于任何intra-chromosomal组,一般建议运行swapAnchors之前运行boundingBox。这使得所有交互在同一边的对角和结果在较小的最小边界框(假设我们不感兴趣的排列锚在每个交互)。

交换。胃肠道<- swapAnchors(gi) boundingBox(swap.gi, group.by.chr)
与4 # # GInteractions对象交互和0元数据列:# # seqnames1 ranges1 seqnames2 ranges2 # # < Rle > < IRanges > < Rle > < IRanges > # # chrA + chrA chrA 1 - 70 - - - chrA 41 - 100 # # chrA + chrB chrA 21 - 30——chrB 1 - 5 # # chrB + chrA chrA每周——chrB 21 - 25日# # chrB + chrB chrB 6 - 10 - - - chrB # # 11 - 15号- - - - - - - # #区域:8范围和0元数据列# # seqinfo: 2因基因组序列;没有seqlengths

这个函数返回一个GInteractions对象的锚地区代表每个边界框的两边。上面的示例标识所有交互的边界框每一对染色体。注意,只有当所有交互定义在一组躺在同一条染色体。函数将会失败如果,例如,组包含国际米兰和intra-chromosomal交互。

实施锚下订单StrictGInteractions

是有点乏味swapAnchors之前每一个调用排序,独特的,boundingBox等等。另一种是使用命名的一个子类StrictGInteractions,第一个锚指数总是大于或等于第二个锚指数。这确保了交互都是标准化的比较对象之间内或之前。这个子类的对象可以通过设置构造模式论点的GInteractions构造函数:

sgi < GInteractions(指数。1、指数。2,所有。地区,模式="strict") class(sgi)
# # [1]“StrictGInteractions”# # attr(“包”)# # [1]“InteractionSet”

另外,现有的GInteractions对象可以很容易地变成了StrictGInteractions对象。这需要一些努力的所有槽两个类之间是相同的。唯一的区别在于执法的锚排列在每个交互。

sgi <——(gi,“StrictGInteractions”)

所有适用的方法GInteractions还可以使用吗StrictGInteractions。唯一的区别在于,锚作业将自动执行的标准排列,通过第一和第二锚指数之间的值。

anchorIds (sgi) < -列表(7:12 1:6)锚(sgi, id = TRUE)
# #第一# #美元[1]1 2 3 4 5 6 # # # #第二# #美元[1]7 8 9 10 11 12

一般来说,这个子类更方便使用的排列锚指数并不被认为是有益的。

的描述InteractionSet

建设

InteractionSet类继承自SummarizedExperiment并持有与每个相关的实验数据交互(连同自己的交互)。每一行的InteractionSet对象对应于一个两两交互作用,而每一列对应一个样本,例如,高c或ChIA-PET图书馆。一个典型的使用将存储为每个样本中的每个交互计算矩阵:

set.seed (1000) Nlibs < - 4计数< -矩阵(rpois (Nlibs *长度(gi),λ= 10),ncol = Nlibs) lib.data < - DataFrame (lib.size = seq_len (Nlibs) * 1 e6) iset < - InteractionSet(计数,胃肠道,colData = lib.data) iset
# # # #类:InteractionSet暗淡:6 4 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15

构造函数将一个现有的GInteractions对象的长度等于矩阵的行数。多个矩阵也可以存储通过提供一个列表。例如,如果我们有一个矩阵归一化互动的频率,这些可以存储与计算:

norm.freq < -矩阵(rnorm (Nlibs *长度(gi)), ncol = Nlibs) iset2 < - InteractionSet(列表(数量=计数,norm.freq = norm.freq),胃肠道,colData = lib.data) iset2
# # # #类:InteractionSet暗淡:6 4 # #元数据(0):# #化验(2):计数norm.freq # # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15

用户和开发人员熟悉的bob电竞体育官网RangedSummarizedExperiment类处理时可能会有点小麻烦InteractionSet类。后者是前者的模拟,更换后基因组的间隔农庄对象与两两交互作用GInteractions对象。

getter

InteractionSet对象支持所有的访问方法SummarizedExperiment类,例如,colData,元数据等等。特别是,分析化验方法可以用来提取数据矩阵:

分析(iset)
# # [1][2][3][4]# # [1]8 5 10 10 # # [2]6 13 3 10 # # [3]5 5 8 11 # # [4]7 9 10 10 # # [5]12 5 11 11 # # 13 4 11 10 [6]
试验(iset2, 2)
# #[1][2][3][4]# #(1)-0.04101814 0.5601652 -1.5290771 0.3305996 # #(2)-1.99163226 -0.2016566 -1.1162936 0.6859423 # #(3)1.72479034 -1.0595593 -0.6015164 -0.2400144 # #(4)1.30351018 -0.8572085 -0.1606118 -0.1214134 # #(5)1.44145260 -0.9848534 0.9340341 0.6012967 # #(6日)0.78692136 -0.9289698 -2.2852293 1.0204081

的相互作用方法提取GInteractions对象包含所有的交互行:

交互(iset)
与6 # # GInteractions对象交互和0元数据列:# # seqnames1 ranges1 seqnames2 ranges2 # # < Rle > < IRanges > < Rle > < IRanges > # # [1] chrA每周——chrA 1 - 10 # # [2] chrB 21 - 25日——chrA每周# # [3]chrA 21 - 30——chrB 1 - 5 # # [4] chrB 6 - 10 # # 11 - 15号的- - - chrB [5] chrA 81 - 90——chrA 61 - 70 # # [6] chrA 91 - 100——chrA 31-40 # # - - - - - - - # #区域:15范围和0元数据列# # seqinfo: 2因基因组序列;没有seqlengths

访问方法GInteractions类也可以直接应用InteractionSet对象。这些方法操作的包装器GInteractions对象在每个InteractionSet,它简化了调用序列:

锚(iset id = TRUE) #比锚(iset)(交互),id = TRUE)
# # # #[1]5 15美元3 12 9 10 # # # # # #[1]1 5美元11 13 7 4
区域(iset)
# #农庄对象15范围和0元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA 11日至20日[3]chrA 21 - 30 * # # [4] chrA 31-40 * # # [5] chrA每周* # #……* # # # # [11]chrB 1 - 5 [12] chrB 6 - 10 * # # [13] chrB * # # 11 - 15号[14]chrB - * # # [15] chrB 21 - 25日* # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

setter

替代的方法SummarizedExperiment支持的InteractionSet类。例如,colData持有的特有信息——一个可能会添加库大小colData:

lib.size < - seq_len (Nlibs) * 1 e6 colData (iset)美元的自由。大小< - lib.size iset自由美元。< - lib.size #大小相同的结果。

交互本身可以替换使用的相互作用替代方法:

新的。胃肠道<- interactions(iset) new.iset <- iset interactions(new.iset) <- new.gi

当然,替换方法的描述GInteractions类也可以InteractionSet对象。这些方法将直接在运作GInteractions对象包含在每个InteractionSet。这往往比提取的交互更方便,修改它们,然后取而代之交互< -

区域(交互(new.iset)得分< - 1区域(new.iset)美元得分< - 1 #与上面一样。

构造子集,结合

构造子集的一个InteractionSet由行将形成一个新对象只包含指定的交互(所有样品和相关的数据),类似于构造子集GInteractions对象。然而,构造子集的对象列将形成一个新的对象只包含指定的相关数据样品。这个新对象仍将包含所有交互,除非构造子集的行是同时执行的。

iset [1:3]
# # # #类:InteractionSet暗淡:3 4 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15
iset [1:2]
# # # #类:InteractionSet暗淡:6 2 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15

InteractionSet对象可以一点结合行操作使用rbind。这形成了一个新的InteractionSet从每个对象,对象包含所有交互关联的数据在所有样本。例如,下面的例子形成一个新对象与一个额外的副本第一个互动:

rbind (iset iset [1])
7 # #类:InteractionSet # #暗淡:4 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15

相同的对象相互作用也可以组合列的cbind方法。这是通常用于组合相同的数据交互,而是来自不同样本。下面的例子的形式InteractionSet对象数据的额外副本与示例3:

cbind (iset iset [3])
# # # #类:InteractionSet暗淡:6 5 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size # #类型:GInteractions # #区域:15

其他方法

排序、重复检测距离计算和重叠的方法InteractionSet对象是相同的GInteractions。即前者的方法有效地包装操作GInteractions对象在每个InteractionSet。因此,只有锚指数将用于排序和重复识别。实验数据被用来区分的行InteractionSet对应于相同的交互。也请记住,你应该使用swapAnchors标准化内比较之前或之间的交互InteractionSet对象(或者,构建你的InteractionSet对象与一个StrictGInteractions对象)。

的描述ContactMatrix

建设

ContactMatrix类继承自带注释的类,旨在代表矩阵中的数据格式。矩阵的每行和每列对应于一个基因组区域,这样每个单元矩阵的表示一个相应的行和列之间的相互作用。该单元格的值通常是互动的阅读对计数,但可以使用任何相关指标。建筑是通过传递矩阵的范围所有行和列的交互区域:

行。我ndices <- 1:10 col.indices <- 9:15 row.regions <- all.regions[row.indices] col.regions <- all.regions[col.indices] Nr <- length(row.indices) Nc <- length(col.indices) counts <- matrix(rpois(Nr*Nc, lambda=10), Nr, Nc) cm <- ContactMatrix(counts, row.regions, col.regions)

对于内存效率的目的,每一行或列的交互区域内部存储所述GInteractions,即,as anchor indices pointing to a set of (sorted) common regions. Rectangular matrices are supported, so the number and order of rows need not be the same as that of the columns in eachContactMatrix。建筑也可以实现直接从指数和常见的集合区域,如下所示:

cm < - ContactMatrix(数量、行。我ndices, col.indices, all.regions) cm
# # # #类:ContactMatrix暗淡:10 7 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

矩阵本身存储为一个矩阵对象的矩阵包中。这提供了支持稀疏矩阵表示,可以节省大量内存,例如,当存储读稀疏地区的互动空间。

getter

数据矩阵可以提取使用as.matrix方法:

as.matrix (cm)
# # [1][2][3][4][5][6][7]# # [1]11 5 10 9 9 9 13 # # [2]8 8 14 17 8 9 11 # # [3]11 15 12 7 10 15 7 # # [4]10 6 11 9 11 8 9 # # [5]5 6 13 11 11 10 10 # # [6]7 12 10 11 10 5 8 # # [7]8 10 8 12 9 8 12 # # [8]11 14 14 8 6 13 7 # # [9]18 9 11 16 12 15 13 # # [10]11 8 9 10 5 9 2

锚区域对应于每行和每列可以提取。这一点如下所示的行操作区域。指数也可以提取id = TRUE,所述GInteractions类。

主持人(厘米、类型=“行”)
与10 # #农庄对象范围和0元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA 11日至20日[3]chrA 21 - 30 * # # [4] chrA 31-40 * # # [5] chrA每周* # # [6]chrA 51-60 * # # [7] chrA 61 - 70 * # # [8] chrA 71 - 80 * # # [9] chrA 81 - 90 * # # [10] chrA 91 - 100 * # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

常见的地区可以提取地区:

区域(厘米)
# #农庄对象15范围和0元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * * # # # # [2] chrA 11日至20日[3]chrA 21 - 30 * # # [4] chrA 31-40 * # # [5] chrA每周* # #……* # # # # [11]chrB 1 - 5 [12] chrB 6 - 10 * # # [13] chrB * # # 11 - 15号[14]chrB - * # # [15] chrB 21 - 25日* # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

继承带注释的也意味着通用元数据可以访问使用元数据方法。

setter

部分或全部数据矩阵可以修改使用as.matrix替代方法:

temp.cm < - cm as.matrix (temp.cm [1]) < - 0

anchorIds替代方法可以用来取代行或列锚指数:

anchorIds (temp.cm) < -列表(1:10,1:7)

地区,replaceRegionsappendRegions替代方法也可以和工作描述GInteractions对象。在下面的示例中,常见的地区可以更新包括GC活动内容:

区域(temp.cm)美元GC < - runif(长度(地区(temp.cm))) #不是真实的价值,显然。区域(temp.cm)
# #农庄对象15范围和1元数据列:GC # # # # seqnames范围链| < Rle > < IRanges > < Rle > | <数字> # # [1]chrA 1 - 10 * | 0.497083446476609 # # [2] chrA 11日至20日* | 0.569044479867443 # # [3]chrA 21 - 30 * | 0.303725936217234 # # [4] chrA 31-40 * | 0.135940368752927 # # [5] chrA每周0.868492268724367 * | # #………………0.538590881042182 # # [11]chrB 1 - 5 * | # # [12] chrB 6 - 10 * | 0.660270303487778 # # [13] chrB * | 0.601533327484503 # # 11 - 15号[14]chrB 16 - 20 * | 0.798828147351742 # # [15] chrB 21 - 25日* | 0.688481955090538 # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

最后,元数据替代方法可用于设置通用的元数据:

元数据(temp.cm) $ < -“我是ContactMatrix”元数据描述(temp.cm)
# # # #元描述[1]“我是ContactMatrix”

没有位置来存储的元数据矩阵的每一个细胞。任何interaction-specific元数据矩阵的表示形式,相当于构建一个新的ContactMatrix——所以,我们可能也会那样做,而不是试图把额外的数据到一个现有的对象。

构造子集,结合

构造子集返回一个ContactMatrix只包含指定的行或列:

cm [1:5]
# # # #类:ContactMatrix暗淡:5 7 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15
厘米[1:5]
# # # #类:ContactMatrix暗淡:10 5 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

应该强调,指标没有关系锚指标子集。例如,第二个构造子集调用不选择列对应于锚地区# 1至# 5。相反,它选择前5列,实际上对应于锚地区# 9 # 13:

锚(cm[1:5],类型=“列”,id = TRUE)
# # [1]9 10 11 12 13

还可以' aContactMatrix,获得一个对象的行和列交换:

t(厘米)
# # # #类:ContactMatrix暗淡:7 10 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

可以做结合rbind行结合起来,对于相同的对象列锚地区;或与cbind列,结合的同一行锚的对象区域。这形成了一个新的矩阵有额外的行或列,像人们预计的矩阵。

rbind(厘米厘米[1:5])#额外的行
# # # #类:ContactMatrix暗淡:15 7 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15
cbind(厘米厘米[1:5])#额外的列
# # # #类:ContactMatrix暗淡:10 12 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

注意,只有需要相同的区域cbindrbind。这两种方法仍将工作如果指数是不同的,但指向同一个基因组坐标。在这种情况下,返回的ContactMatrix将包含重构指标指向一个共同区域各组成对象的联盟。

排序和重复

排序的ContactMatrix包括交换行和列,行和列索引都是按升序。这表示是简单的解释,相邻的行或列将映射到相邻的地区。

temp.cm < - cm anchorIds (temp.cm) < -列表(10:1,15:9)锚(排序(temp.cm) id = TRUE)
# # # # $行[1]1 2 3 4 5 6 7 8 9 10 # # # # # # $列[1]9 10 11 12 13 14 15

请注意,订单函数不返回一个整数向量,正如你所预料的那样。相反,它返回一个列表的两个整数向量,向量包含排列在第一和第二要求对行和列进行排序,分别为:

订单(temp.cm)
# # # # $行[1]10 9 8 7 6 5 4 3 2 1 # # # # # # $列[1]7 6 5 4 3 2 1

重复的行或列被定义为那些有相同的索引作为另一个行或列,分别。的复制两个逻辑向量的方法将返回一个列表,显示的行或列被认为是重复的(第一次出现是视为non-duplicate)。的独特的方法将返回一个ContactMatrix所有重复的行或列将被去除。

temp.cm < - rbind(厘米厘米)重复(temp.cm)
# # # # $行[1]假假假假假假假假假假真# #[12]真的真的真的真的真的真的真的真的真的# # # # # # $列[1]假假假假假假假的
独特的(temp.cm)
# # # #类:ContactMatrix暗淡:10 7 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

用户应该意识到数据矩阵的值考虑识别重复或在排序。只有锚指数用于排序和重复检测。行或列相同的锚指数不会区分矩阵对应的值。

距离计算

pairdist函数可以应用于一个ContactMatrix返回一个矩阵的距离相同的维度提供对象。每个单元格都包含中点之间的距离相应的行/列锚地区。

pairdist (cm)
# #[1][2][3][4][5][6][7]# #[1]80 90不详不详不详不详不详# #[2]70 80不详不详不详不详不详# #[3]60 70不详不详不详不详不详# #[4]50 60不详不详不详不详不详# #[5]40 50不详不详不详不详不详# #[6]30 40不详不详不详不详不详# #[7]20 30不详不详不详不详不详# #[8]10 20不详不详不详不详不详# #[9]0 10不详不详不详不详不详# #[10]10 0不详不详不详不详不详

回想一下,距离定义为inter-chromosomal交互,所以相应的值仅仅是将细胞矩阵NA。可以使用不同的距离定义通过改变类型参数,所述GInteractions

intrachr函数还可用于识别这些细胞对应intra-chromosomal交互:

intrachr (cm)
# #[1][2][3][4][5][6][7]# #(1)真的真的假假假假假的# #(2)真的真的假假假假假的# #(3)真的真的假假假假假的# #(4)真的真的假假假假假的# #[5]真的真的假假假假假的# #[6]真的真的假假假假假的# #[7]真的真的假假假假假的# #[8]真的真的假假假假假的# #[9]真的真的假假假假假的# #[10]真的真的假假假假假的

重叠的方法

ContactMatrix类访问overlapsAny方法时,主题参数是一个农庄对象。这个方法返回一个列表的两个逻辑向量表示是否行或列锚区域重叠的时间间隔(s)的兴趣。

of.interest < -农庄(“chrA IRanges (100)) olap < - overlapsAny olap(厘米,of.interest)
# # # # $行[1]假假假假的真的真的真的真的真的真的# # # # # # $列[1]真的真的假假假假假的

用户可以使用这个子集ContactMatrix,只选择那些重叠的行或列的区域利益。或者,我们可以设置,或与这些向量或口罩,使用功能:

和。面具< -外(olap $行,olap美元列,“&”)。面具< -外(olap $行,olap美元列,“|”)

这可以用来掩盖在考试的数据矩阵所有无趣的条目。例如,假设我们只感兴趣的条目对应于内的相互作用of.interest间隔:

我的。矩阵< - as.matrix (cm) my.matrix [!。< - NA my.matrix面具)
# # [1][2][3][4][5][6][7]# # [1]NA NA不详不详不详不详不详# # [2]NA NA不详不详不详不详不详# #[3]不详不详不详不详不详NA NA # # [4] NA NA不详不详不详不详不详# #[5]5 6不详不详不详不详不详# #[6]7 12不详不详不详不详不详# #[7]8 10不详不详不详不详不详# #[8]11 14不详不详不详不详不详# #[9]18 9不详不详不详不详不详# # 11[10]8不详不详不详不详不详

二维重叠也可以与执行ContrastMatrix通过运行overlapsAnyGInteractions随着主题。这将返回一个逻辑矩阵表示查询的哪个细胞矩阵与条目主题对象重叠。例如,如果第一个地区进行交互of.interest交互,第二个地区是一些间隔的B染色体(下图),我们可以做的:

olap < - overlapsAny (cm, GInteractions (of.interest,农庄(“chrB IRanges (20))))
# # .Seqinfo警告。mergexy (x, y): 2组合对象没有序列水平共同之处。(使用# # suppressWarnings()压制这个警告。)
olap
# #[1][2][3][4][5][6][7]# #(1)假假假假假假假# #(2)假假假假假假假# #(3)假假假假假假假# #[4]假假假假假假假# #[5]假假真的真的真的真的假# #(6日)假假的真的真的真的真的假# #[7]假假的真的真的真的真的假# #[8]假假的真的真的真的真的假# #[9]假假的真的真的真的真的假# #[10]假假的真的真的真的真的假的

类之间的转换

导致了GInteractions成一个ContactMatrix

如果我们有一个GInteractions对象,我们可以把它转换成ContactMatrix与指定的行和列。每两两交互的GInteractions对应于零,一个或两个细胞ContactMatrix(如果是零以外的指定的行和列,很明显;两个相互作用时ContactMatrix穿越对角线的交互空间)。每一个细胞都充满了一个任意值与相应的交互,如计数、规范化的接触频率。细胞没有相应的交互GInteractions对象设置为NA

计数< - rpois(长度(gi),λ= 10)。< - 2:10所需的行。新关口< - 1:5。cm <- inflate(gi, desired.rows, desired.cols, fill=counts) new.cm
# # # #类:ContactMatrix暗淡:9 5 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15
锚(新。厘米,id = TRUE)
# # # # $行[1]2 3 4 5 6 7 8 9 10 # # # # # # $列[1]1 2 3 4 5
as.matrix (new.cm)
# #[1][2][3][4][5]# #[1]不详不详不详不详不详# #[2]不详不详不详不详不详# #[3]不详不详不详不详不详# #[4]缺缺缺缺13 # #[5]不详不详不详不详不详# #[6]不详不详不详不详不详# #[7]不详不详不详不详不详# #[8]不详不详不详不详不详# # 7 [9]NA NA NA NA

在上面的例子中,通过提供指定所需的行和列两个整数向量包含指数的锚感兴趣的区域。另一种方法就是通过了农庄对象的膨胀方法。所需的行/列被定义为那些相应的锚区域重叠的时间间隔农庄对象。

膨胀(gi,农庄(“chrA”, IRanges(100)),农庄(“chrA IRanges(50)),填补=计数)
# # # #类:ContactMatrix暗淡:6 5 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

最后,一个特征向量可以通过选择所有行/列躺在一组染色体。

膨胀(gi,“chrA”、“chrB”,填补=计数)
# # # #类:ContactMatrix暗淡:10 5 # #类型:矩阵# # rownames:零# # colnames:零# #元数据(0):# #区域:15

方法用于将一个相同InteractionSet对象到一个ContactMatrix通过对底层操作GInteractions对象存储前。一些额外的参数可用于提取特定的数据值InteractionSet来填补ContactMatrix。例如,如果我们要填补ContactMatrix从3日图书馆使用计数iset我们可以做:

新的。cm <- inflate(iset, desired.rows, desired.cols, sample=3) as.matrix(new.cm)
# #[1][2][3][4][5]# #[1]不详不详不详不详不详# #[2]不详不详不详不详不详# #[3]不详不详不详不详不详# #[4]10缺缺缺缺# #[5]不详不详不详不详不详# #[6]不详不详不详不详不详# #[7]不详不详不详不详不详# #[8]不详不详不详不详不详# # 11 [9]NA NA NA NA

降低一个ContactMatrix成一个InteractionSet

相反的过程也可以用于转换ContactMatrix成一个InteractionSet。这将两两交互相应非报告NA矩阵的细胞,该细胞作为实验数据存储的值InteractionSet:

新的。iset<- deflate(cm) new.iset
# #类:InteractionSet # #暗淡:69 1 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames (1): 1 # # colData名称(0):# #类型:StrictGInteractions # #区域:15

请注意任何重复的相互作用是自动删除。这样的重复可能发生如果有重复的行/列或当——更实际ContactMatrix穿越对角线的互动空间。在大多数情况下,重复的删除是明智的矩阵的值应该反映在对角线,这样重复的条目中的信息是多余的。但是,如果情况并非如此,我们可以保留副本供以后处理:

缩小(厘米,崩溃= FALSE)
# #类:InteractionSet # #暗淡:70 1 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames (1): 1 # # colData名称(0):# #类型:GInteractions # #区域:15

线性化的InteractionSet成一个RangedSummarizedExperiment

InteractionSet存储实验数据为两两交互跨二维交互空间。这可以“线性化”为一维数据的线性基因组仅考虑单锚地区涉及的交互。例如,假设我们感兴趣的交互涉及到染色体的特定区域,下面定义为x:

x < -农庄(“chrA IRanges(42岁,48)交易所< -线性化(iset x)交易所
# # # #类:RangedSummarizedExperiment暗淡:2 4 # #元数据(0):# #化验(1):“# # rownames:零构成了rowData名称(0):# # # # colnames:零# # colData名称(1):lib.size

线性化函数将选择所有涉及的交互x并返回一个RangedSummarizedExperiment对象包含与这些相关的数据交互。每一行的基因组间隔交易所对应于其他(即。,non-x)地区参与每个选定的交互。当然,对于self-interactions之间x和函数本身只是报告x在相应的时间间隔。

rowRanges(交易所)
与2和0 # #农庄对象元数据列:链# # # # seqnames范围< Rle > < IRanges > < Rle > # # [1] chrA 1 - 10 * # # [2] chrB 21 - 25日* # # - - - - - - - # # seqinfo: 2因基因组序列;没有seqlengths

这对于崩溃的2 d转换方法是有用的数据转换为一维形式更容易处理。例如,如果序列计数被存储在iset,那么线性化数据交易所可以分析好像代表基因组覆盖率(其中的深度报道表示每个地区之间的相互作用的强度rowRanges(交易所)和该地区的兴趣x)。一个应用程序将会在高c数据转换成pseudo-4C数据,指定的“诱饵”地区x

总结

所以我们有——三个类来处理交互数据的形式多种多样。我们覆盖大部分的主要功能在这个描述,尽管细节对于任何给定的方法可以通过标准的方法,例如,?”锚,GInteractions”的手册页方法。如果你认为的一些通用的功能可能是有用的,不存在在这里,只是让我们知道,我们会尝试把它在某个地方。

sessionInfo ()
# # R版本3.6.1(2019-07-05)# #平台:x86_64-pc-linux-gnu(64位)# #下运行:Ubuntu 18.04.3 LTS # # # #矩阵产品:默认# #布拉斯特区:/home/biocbuild/bbs - 3.10 - bioc / R / lib / libRblas。所以# # LAPACK: /home/biocbuild/bbs - 3.10 - bioc / R / lib / libRlapack。# # # #语言环境:# # [1]LC_CTYPE = en_US。utf - 8 LC_NUMERIC = C # #[3]而= en_US。utf - 8 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 = C LC_TELEPHONE = # # [11] LC_MEASUREMENT = en_US。utf - 8 LC_IDENTIFICATION = C附加基本包:# # # # # #[1]平行stats4统计图形grDevices跑龙套数据集# #[8]方法基础# # # #其他附加包:# # [1]InteractionSet_1.14.0 SummarizedExperiment_1.16.0 # # [3] DelayedArray_0.12.0 BiocParallel_1.20.0 # # [5] matrixStats_0.55.0 Biobase_2.46.0 # # [7] GenomicRanges_1.38.0 GenomeInfoDb_1.22.0 # # [9] IRanges_2.20.0 S4Vectors_0.24.0 # # [11] BiocGenerics_0.32.0 BiocStyle_2.14.0 # # [13] knitr_1.25 # # # #通过加载一个名称空间(而不是附加):# # [1]Rcpp_1.0.2 XVector_0.26.0 magrittr_1.5 # # [4] zlibbioc_1.32.0 lattice_0.20-38 rlang_0.4.1 # # [7] stringr_1.4.0 tools_3.6.1 grid_3.6.1 # # [10] xfun_0.10 htmltools_0.4.0 yaml_2.2.0 # # [13] digest_0.6.22 Matrix_1.2-17 GenomeInfoDbData_1.2.2 # # [16] BiocManager_1.30.9 bitops_1.0-6 rcurl_1.95 - 4.12 # # [19] evaluate_0.14 rmarkdown_1.16 stringi_1.4.3 # # [22] compiler_3.6.1