openPrimeR提供了设计和分析多重聚合酶链反应(PCR)引物的功能。下面我们将介绍引物设计、引物分析和引物组比较三种应用场景的典型工作流程。
openPrimeR的开发为评估和设计多重PCR引物提供了一种合理的方法,可以同时扩增多个模板序列。的概念报道对于多重PCR至关重要,因为它描述了一组引物可以扩增的模板的数量。该包是专门开发的,使研究人员能够评估现有引物组的覆盖范围,以及设计新的引物组,以最小数量的引物最大化覆盖范围。为了提供一个用户友好的工具,我们创建了一个Shiny应用程序,它可以通过openPrimeRui包中。的openPrimeR包可以计算引物最重要的与pcr相关的物理化学性质,以衡量一组引物是否可以提供高产量。以下列表提供了可以使用openPrimeR回答的研究问题:
openPrimeR需要外部程序来实现某些特性,特别是用于计算引物的物理化学性质。请确保在您的系统上安装了以下工具,并且它们位于您的系统路径中:
如果您想访问免疫球蛋白储存库IMGT在openPrimeR Shiny应用程序中,你应该额外完成以下依赖项:
openPrimeR将自动检查所有依赖项,并在包附加时通知你任何缺失的依赖项:
请注意,如果缺少外部程序,该工具仍然有效。但是,我们建议满足所有依赖关系,以保证最佳的用户体验。
如果你想使用openPrimer闪亮的应用程序,请安装openPrimeRui打包并考虑其文档。在接下来的文章中,我们将只关注openPrimeR包装本身,而不是在前面。
为了设计引物,我们只需要加载一组模板序列,并定义目标结合区域。为了分析和比较现有引物组的属性,我们还需要加载一组或多组引物。下表总结了每个任务可能的输入数据格式:
任务 | 模板 | 引物 | 输入文件格式 |
---|---|---|---|
设计引物 | ✓ | FASTA、CSV | |
分析引物 | ✓ | ✓ | FASTA、CSV |
比较引物 | ✓ | ✓ | FASTA、CSV |
要加载一组模板序列,只需输入一个有效模板序列的路径FASTA文件和使用read_templates ()
.在下面的代码片段中,我们存储与包一起提供的FASTA文件的路径fasta.file
.该文件包含模板序列。在我们的例子中,我们将加载人类重链免疫球蛋白基因的序列:
指定一个包含模板的FASTA文件:fasta.file<-执行(“extdata”,“IMGT_data”,“模板”,“Homo_sapiens_IGH_functional_exon.fasta”,包=“openPrimeR”)#从fasta.file中加载模板序列seq.df.simple < -read_templates(fasta.file)
成功加载模板序列后,我们可以研究的结构seq.df.simple
,这是一个模板
对象。自模板
类派生自data.frame
,您可以在相同的数据帧中使用它。例如,我们可以通过检索第一个模板序列的头
seq.df.simple$头(1]# >[1]”> M99641 | IGHV1-18 F * 01智人| | | L-PART1 + V-EXON | 47 . . 92 + 177 . .483|353 nt|1| | | | |353+0=353| | |"
如您所见,模板的头部包含了几条信息,这些信息由管道符号(|
),其中包括:
将这些注释加载到模板
对象,现在将为其提供额外的参数read_templates ()
.我们特别感兴趣的是加载组信息,因为这些信息对于以后解释结果非常重要。在下一个代码片段中,我们使用hdr.structure
变量来注释FASTA文件头提供的元信息。此外,我们提供delim
参数read_templates ()
来指定管道符号用于分隔各个字段,并提供id.column
属性中的标识符,以标识哪个字段应用作模板
对象:
hdr.structure<-c(“加入”,“集团”,“物种”,“功能”)seq.df<-read_templates(fasta。文件、hdr.structuredelim =“|”,id.column=“集团”)
由于我们已经指定从FASTA标头加载登录、组、种类和函数,现在可以从seq.df
.例如,对于第一个模板,我们可以检索以下信息:
#显示第一个模板加载的元数据c(seq.df$加入(1), seq.df$集团(1), seq.df$物种(1), seq.df$函数(1])#> [1] "M99641" "IGHV1" "智人" "F"#显示第一个模板的ID(组seq.df$ID (1]#> [1] " ighv1-18 *01"
注意,只有集团
注释对以后的结果可视化有影响。其他字段可以任意设置,没有任何影响。如果没有希望加载的元数据,可以简单地使用read_templates ()
用于声明的调用seq.df.simple
.在这种情况下,所有模板都被认为属于一个默认组。
在使用read_templates ()
,引物结合区域设置为正向引物的前30个碱基,反向引物的后30个碱基,其中第一个指5 '端和最后的指3 '端。我们可以通过访问来查看正向引物和反向引物的目标结合区域seq.df Allowed_fw美元
或seq.df Allowed_rev美元
分别为:
显示正向引物的第一个模板的绑定区域seq.df$Allowed_fw [1]#>[1]“atggactggacctggagcatccttttcttg”在模板中显示相应的间隔c(seq.df$Allowed_Start_fw [1), seq.df$Allowed_End_fw [1])#> [1] 1 30显示反向引物的第一个模板的绑定区域seq.df$Allowed_rev [1]#>[1]“cgacacggccgtgtattactgtgcgagaga”在模板中显示相应的间隔c(seq.df$Allowed_Start_rev [1), seq.df$Allowed_End_rev [1])#> [1] 324 353
在接下来的章节中,我们将描述两种可以使用定义引物结合区域的方法assign_binding_regions ()
.
若要为所有模板分配统一的目标绑定区域,可以指定指示正向和反向引物绑定区域的位置间隔。对于正向引物,间隔是相对于模板5 '端指定的,而对于反向引物,间隔是相对于模板3 '端指定的。在下面的例子中,我们设置正向引物的结合区域(弗兰克-威廉姆斯
)至前50个模板碱基及后40个反向引物碱基(牧师
):
请注意,我们已经提供了间隔[1,40],以允许在反向引物模板的最后40个碱基中进行绑定。这是因为反向引物的结合区域相对于3 '端提供,而正向引物的结合区域相对于5 '端提供。通过这种方式,反向绑定区域可以独立于单个模板的长度进行注释。
让我们用第一个模板序列验证正向引物和反向引物的不同结合区域:
通过为每个引物方向提供包含引物目标绑定区域的FASTA文件,可以为每个模板分配单独的绑定区域。这些文件的FASTA头应该与前面提供的模板FASTA文件中的头相匹配。在下面的示例中,我们使用随包提供的FASTA文件仅为正向引物定义单独的绑定区域。在本例中,FASTA文件指定已加载的人类重链免疫球蛋白序列的前导序列seq.df
:
l.fasta.file < -执行(“extdata”,“IMGT_data”,“模板”,“Homo_sapiens_IGH_functional_leader.fasta”,包=“openPrimeR”)template.df<-assign_binding_regions(seq.df弗兰克-威廉姆斯=l.fasta.file,牧师=零)
每个模板的正向引物的结合区域现在可能是不同的。例如,下面两个模板的绑定区域出现在模板中的不同位置:
两个具有不同绑定区域的模板的示例c(template.df$Allowed_Start_fw [1), template.df$Allowed_End_fw [1])#> [1] 1 57c(template.df$Allowed_Start_fw [150), template.df$Allowed_End_fw [150])#> [1] 1 60
请注意,由于我们没有为反向引物提供单独的结合区域,因此它们的结合区域没有进行调整:
在开始分析之前,我们需要定义分析设置。openPrimeR提供了预定义的XML文件,为不同的应用程序指定默认设置:
list.files(执行(“extdata”,“设置”,包=“openPrimeR”),模式=“*\ \. xml”)#> [1] "A_Taq_PCR_design.xml" "B_Taq_PCR_evaluate.xml"#> [3] " c_taq_pcr_high_strict .xml"
在本例中,我们选择了Taq聚合酶的高严格引物设计条件,并加载DesignSettings
对象与read_settings ())
:
settings.xml < -执行(“extdata”,“设置”,“C_Taq_PCR_high_stringency.xml”,包=“openPrimeR”)设置< -read_settings(settings.xml)
你可以使用str(设置)
探索…的结构设置
:
槽 | Getter / Setter | 目的 |
---|---|---|
Input_Constraints |
约束条件() |
底漆性能的期望值 |
Input_Constraint_Boundaries |
constraintLimits () |
底漆设计时放松约束的限制 |
Coverage_Constraints |
cvg_constraints () |
估计覆盖率的约束条件 |
PCR_conditions |
PCR () |
实验PCR条件 |
constraint_settings |
conOptions () |
用于计算约束的设置 |
自设置
对象包含引物分析的所有相关信息,您应该在开始分析之前查看并可能自定义设置。特别要确保设置中指定的PCR条件与您的实验条件一致。例如,PCR钠离子浓度可以通过PCR(设置)Na_concentration美元
.此外,覆盖约束通常应该包含一个约束(例如。coverage_model
,primer_efficiency
,或annealing_DeltaG
).此外,为了设计引物,您应该选择提供高度特定的覆盖调用的覆盖约束。然而,为了本小插图的目的,我们将不应用任何覆盖限制,而是严格限制引物和模板之间不匹配的数量:
没有底漆覆盖限制(不推荐!)cvg_constraints< -(设置)列表()#相反,考虑所有底漆最多3次不匹配,以覆盖相应的模板conOptions(设置)$allowed_mismatches < -3.
您还应该确保高质量引物的物理化学约束条件符合您的期望。例如,如果我们不想使用GC钳位准则过滤设计的引物,我们可以通过以下方式删除对GC钳位的要求:
design.settings<-设置约束(design.settings) < -约束(design.settings) [!grepl(“gc_clamp”,的名字(约束(design.settings))))
我们也可能希望只设计特定长度的引物。为了只生成长度为25的引物,我们可以指定这个via
在设计引物时,我们可能还希望防止任何不匹配的结合。要实现这一点,我们只需设置
有关更多可能的自定义,请参考设置类的文档,可以通过DesignSettings ?
.
自定义设置后,我们可以将修改后的设置以以下方式存储到磁盘:
方法加载存储的设置,以便下次执行分析read_settings
函数使用out.file
作为一个论证。
由于加载的模板序列只包含人类免疫球蛋白的可变区域而不是常量区域,我们将限制自己只设计正向引物。设计引物,我们只需要一个功能,即design_primers ()
中指定的设置design.settings
中提供的模板和绑定区域template.df
.通过设置mode.directionality
对于' fw ',我们指定我们只想设计正向引物。其他可能的选择是牧师
仅用于设计反向引物和这两个
用于设计正向和反向引物。此外,我们将子集template.df
到前两个模板序列,以限制本例设计过程的运行时间:
#为前两个模板设计正向引物optimal.primers<-design_primers(template.df [1:2),mode.directionality=“转发”,设置=design.settings)
optimal.primers
是否有存储最优引物的列表optimal.primers opti美元
并将相应的过滤引物存储在美元optimal.primers过滤
.所有评估的熔化温度的最佳引物组存储在optimal.primers all_results美元
.
引物设计功能可通过多种方式定制。的init.algo
参数可用于指定如何生成初始引物集。默认情况下,这是通过从模板序列(' naive ')中提取子字符串来实现的。生成简并引物的基于树的初始化策略可以通过设置激活init.algo
到“树”,这有利于相关的模板序列。
另一个重要的论点是required.cvg
,定义模板所需的覆盖率。默认情况下,该值设置为1,表示应该覆盖100%的模板。如果引物集不能达到所需的覆盖范围,满足通过设置
参数时,为了达到目标覆盖率,限制被放宽。此行为可以通过设置来禁用required.cvg
为0。
的opti.algo
参数指定用于优化起始集的算法。默认情况下,这是一个贪婪算法(' greedy '),但我们也可以选择一个整数线性程序(' ILP ')。ILP确保设计的引物集是最小的,但这是以最坏情况的指数运行时间为代价的。因此,对于小型模板集,建议使用ILP。对于更大的模板集,应该使用默认的(' Greedy '),这在多项式运行时提供了一个近似的解决方案。
为了结束引物设计任务,让我们将设计好的引物存储为FASTA文件:
下面,我们将分析现有引物组的物理化学性质。由于我们之前设计的一套引物比较少,所以我们会先加载一套新的引物。
与模板类似,引物也可以从FASTA文件加载。类似于确保头中的信息通过正确加载read_templates ()
,您应该确保FASTA文件中正确地注释了引物方向。这意味着每个引物的标题都应该包含一个关键字,可以唯一地标识该引物是正向引物还是反向引物。我们要加载的FASTA文件包含为人类IGH基因可变区域设计的正向引物Ippolito等人。.由于所有引物都是正向引物,FASTA文件中所有引物的头都用' _fw '关键字标注。因此,我们设置fw.id
理由read_primers ()
因此:
定义要加载的FASTA引物文件底漆。位置< -执行(“extdata”,“IMGT_data”,“引物”,“IGHV”,“Ippolito2012.fasta”,包=“openPrimeR”)#加载底漆底漆。df < -read_primers(primer.locationfw.id=“_fw”)
我们可以通过以下方式查看引物的标识符和序列:
打印(primer.df [,c(“ID”,“转发”)))#> ID Forward#> 2 Ippolito2012|VH1|1_fw caggtccagctkgtrcagtctgg#> 1 Ippolito2012|VH157|2_fw caggtgcagctggtgsartctgg#> 3 Ippolito2012|VH2|3_fw cagrtcaccttgaaggagtctg#> Ippolito2012|VH3|4_fw gaggtgcagctgktggagwcy#> 7 Ippolito2012|VH4|5_fw caggtgcagctgcaggagtcsg#> 6 Ippolito2012|VH4-DP63|6_fw caggtgcagctacagcagtggg#> 8 Ippolito2012|VH6|7_fw caggtacagctgcagcagcagtca#> Ippolito2012|VH3N|8_fw tcaacacaacggttcccagtta
为了确定加载的引物满足哪些生化约束,我们可以使用check_constraints ()
,它只需要一组底漆、一组模板和一个设置对象。由于我们想要确定沿着整个模板序列的引物的覆盖率,我们将通过修改约束设置将允许的偏离覆盖率事件的比例设置为100%。然后我们调用check_constraints ()
以确定定义的所有约束条件设置
:
#允许脱靶覆盖conOptions(设置)$allowed_other_binding_ratio < -c(“马克斯”=1.0)#评估在“设置”中发现的所有约束constraint.df<-check_constraints(底漆。df、template.df设置,active.constraints=的名字(约束(设置)))
注意,我们也可以只计算via指定的约束的子集设置
如果我们通过了active.constraints
参数check_constraints ()
.的constraint.df
变量提供引物
包含计算通过提供的所有约束的结果的数据帧设置
(例如底漆覆盖率,气相色谱比,熔化温度)。中的相应列可以检索各个约束的值constraint.df
.在下文中,我们将更详细地探讨模板的覆盖范围。
类中标注了每个入门程序所覆盖的模板的数量primer_coverage
专栏:
为了识别覆盖单个模板的引物,我们可以使用注释模板数据帧中的覆盖信息update_template_cvg ()
:
现在,primer_coverage
列也可以在template.df
这样我们就可以确定覆盖集合中前五个模板的引物的数量:
覆盖模板序列的总体比例可以通过get_cvg_ratio ()
:
输出结果表明,根据当前指定的引物覆盖条件,引物集有望扩增99.35%的模板(最多3个错配)。我们可以通过计算进一步的统计数据来了解更多的覆盖率。例如,我们可能感兴趣的是确定哪些模板组需要被放大,哪些不需要。为此,我们可以使用get_cvg_stats ()
,它根据模板序列的组注释提供了覆盖模板序列数量的信息:
集团 | 报道 |
---|---|
总计 | 155人中的154人(99.35%) |
IGHV1 | 25 / 25 (100%) |
IGHV2 | 21 / 21 (100%) |
IGHV3 | 55 / 56 (98.21%) |
IGHV4 | 47 / 47 (100%) |
IGHV5 | 3 / 3 (100%) |
IGHV6 | 2 / 2 (100%) |
IGHV7 | 1 / 1 (100%) |
在这种情况下,我们看到除了一个IGHV3模板外,所有的模板似乎都没有被引物集覆盖。覆盖范围的可视化可以通过
这张图显示了三个条形图:
对于加载的引物集,识别覆盖率几乎与预期覆盖率一样高,这表明所分析的引物集应该具有较高的扩增保真度。请注意,对于IGHV5,识别覆盖率为0%,而预期覆盖率为100%。这只是表明没有引物能够完全补充任何IGHV5模板,然而,根据覆盖条件,有引物可以通过不匹配的绑定覆盖所有IGHV5模板。
通常,出于成本和引物效率的考虑,人们希望避免使用大型引物集。我们提供了一种方法,通过计算关于模板覆盖的最优子集来减少现有引物集的大小。使用这种方法,可以在不牺牲任何覆盖的情况下限制引物集的大小。我们可以计算覆盖已经被注释的引物集的所有最优子集subset_primer_set ()
:
primer.subsets
是一个列表我-th条目包含大小的引物集我.例如,大小为3的最优子集可以通过primer.subsets [[3]]
.通过绘制所有最优子集的覆盖率,我们可以很容易地确定最合适的子集:
该图表显示了两种类型的信息。折线图表示被覆盖模板的总百分比,堆叠柱状图表示单个引物的覆盖率。由于集合中的一些引物覆盖相同的模板,对于大小为3或更大的子集,堆叠条的累积覆盖率超过100%,尽管对于大小为3的子集,总覆盖率似乎已经饱和。有3个以上引物的子集似乎只能提供额外的模板冗余覆盖。因此,我们可能决定选择大小为3的引物子集,因为它似乎可以实现与完整引物集相同的覆盖:
我们可以验证整个引物集的覆盖范围和大小为3的子集似乎是匹配的get_cvg_ratio ()
:
引物在模板中的结合区域可以用plot_primer_binding_regions ()
:
该图的x轴显示引物相对于目标结合区域的结合位置。位置-1
表示目标结合区域的结束,我们可以看到所有引物都在目标区域之外结合。由于我们指定了免疫球蛋白的前导子作为靶区,这就意味着所有引物都在外显子的开头结合,这就保证了引物可以恢复完整的抗体序列。用于扩增免疫球蛋白的典型引物集将针对外显子,即直接跟随前导子的区域。为了研究各个模板的引物绑定的各个位置,我们可以使用plot_primer ()
.在这种情况下,我们只是为绘图函数提供了第一个引物和前十个模板,以限制绘图的维度:
该图将覆盖模板的引物以箭头形式显示在相应模板上方。如果模板被覆盖,则显示为黑线,否则显示为灰色。
我们可以确定哪些引物通过了提供给check_constraints
功能通过视觉检查通过plot_constraints ()
:
该图显示了每个引物的哪些约束被传递(蓝色),哪些约束失败(红色)。例如,查看指示GC钳约束的列,我们看到只有Ippolito2012|VH3|4_fw和Ippolito2012|VH6|7_fw和Ippolito2012|VH3N|8_fw不满足我们对GC钳的要求。这是因为两个引物都没有GC钳,尽管我们在设置中要求GC钳的长度在1到3之间:
#查看不符合GC约束的引物的终端GC数量constraint.df$gc_clamp_fw [!constraint.df$EVAL_gc_clamp]#> [1] 0 0 0#查看所需的终端gc数量:约束(设置)$gc_clamp#> min最大值#> 1
如果你想知道为什么所有评估引物的特异性似乎都很低,这可以用引物的结合区域来解释。正如我们前面所看到的,所有引物都在目标结合区外结合。因此,每个引物的特异性都是0%,永远无法满足引物特异性的约束。
我们不仅可以看到一个引物是否通过了一个特定的约束,还可以看到一个特定属性对应的值的分布。例如,让我们通过创建直方图来看看引物中末端gc的数量:
y轴表示引物在其3 '端显示一定数量的gc的数量。虚线表示根据我们传递到的设置对象所期望的GC钳的范围plot_constraint ()
.
我们之前所有的评估都是在不要求引物实际满足我们假设的任何约束条件的情况下进行的。我们可以根据一组生化约束条件筛选引物,这样只保留满足所有要求的引物。例如,如果我们想只选择满足GC钳和熔化温度范围要求的引物,我们可以通过以下方式获得过滤后的数据集:
现在,我们可以对这个数据集进行进一步的分析。例如,使用get_cvg_ratio ()
,我们可以确定过滤后的引物集覆盖模板的百分比仅为13.55%,因为过滤后只剩下1个引物。
通过将已分析的引物集及其相应的模板和设置传递给,我们可以创建一个PDF报告,该报告总结了一组引物的分析create_report ()
:
定义输出文件的路径我的。文件< -tempfile(fileext =. pdf”)#为约束存储PDF报告。my.file中的Df 'create_report(约束。df、template.df我的。file,设置,sample.name =“我的分析”)
注意,这个函数需要pandoc
还有乳胶
这样rmarkdown
可以创建PDF报告。
为了比较现有的引物集,有必要为每个引物集预先计算所有感兴趣的约束,这可以通过check_constraints ()
正如我们前面所演示的。而不是评估多个引物集,我们将简单地加载预评估的引物集和存储为的模板集CSV文件。例如,我们可以以以下方式存储之前的评估结果,以便稍后加载这些数据:
primer.xml < -tempfile(“my_primers”,fileext =. csv”)write_primers(约束。df、primer.xml“CSV”)template.xml < -tempfile(“my_templates”,fileext =. csv”)write_templates(约束。df、template.xml“CSV”)
对于下面的例子,我们将简单地加载openPrimeR包附带的引物和模板:
#定义我们想要加载的引物集选取。集< -c(“Glas1999”,“Rubinstein1998”,“Cardona1995”,“Persson1991”,“Ippolito2012”,“Scheid2011”)列出所有可用的IGH底漆套装底漆。文件< -list.files(路径=执行(“extdata”,“IMGT_data”,“比较”,“primer_sets”,“本”,包=“openPrimeR”),模式=“*\ \. csv”,full.names =真正的)#加载所有可用底漆组primer.data<-read_primers(primer.files)#只选择通过'sel.sets'定义的集合选取。我dx <-哪一个(的名字(primer.data)%, %sel.sets)primer.data<-primer.data [sel.idx]为每个引物组提供一套模板模板。文件< -代表(执行(“extdata”,“IMGT_data”,“比较”,“模板”,“IGH_templates.csv”,包=“openPrimeR”),长度(primer.data))template.data<-read_templates(template.files)
这两个,primer.data
而且template.data
分别包含初始数据帧和模板数据帧的列表。注意,这些列表应该总是具有相同的长度,也就是说,每个引物集都应该有一个相关联的模板集,反之亦然。加载引物和模板数据集后,我们可以绘制每个引物集中满足的约束的概述:
plot_constraint_fulfillment(底漆。数据,设置,plot.p.vals =假)#>警告:' guides( = FALSE) '已弃用。请使用“参考线”( = #> "none")代替。
在该图中,每个facet对应一个引物集,每个物理化学约束显示为一个彩色条,其高度表示满足约束的引物的百分比。对情节的一个直观的解释是,具有高质量引语的布景应该有很多高杠。例如,我们可以很快看到,Persson et al.(1991)的引物中没有任何引物满足我们对GC比例的要求,根据加载设置,GC比例应该在1到3之间,以确保引物的结合行为相似。
可以更详细地研究每个评估约束的分布。例如,为了研究GC比对每组引物熔化温度的影响,我们可以创建以下箱线图:
plot_constraint(底漆。数据,设置,active.constraints=c(“gc_ratio”,“melting_temp_range”))#>警告:' guides( = FALSE) '已弃用。请使用“参考线”( = #> "none")代替。
在箱线图中,每个点对应一个引物,方框从下到上显示第1、2和3个四分位数。由于我们已经向绘图功能提供了当前约束设置,因此GC比和熔化温度的期望范围在图中以水平虚线表示。该图显示,Cardona等人(1995)的引物集的GC比都在期望的范围内,并且有一个小的差异,而其他引物集的GC比的差异要大得多,例如Glas等人(1999)的引物集。可视化显示了GC比和熔化温度之间的关系。Cardona、Persson和Rubinstein的引物组在GC比上都有小的偏差,影响其熔化温度的小偏差,而其他引物组在这两种性能上都有很大的差异。
还记得我们用plot_constraint_fulfillment ()
揭示了大多数加载引物集不符合特异性约束。通过绘制每个引物组通过的结合区域plot_primer_binding_regions ()
我们可以找出原因:
plot_primer_binding_regions(底漆。数据、template.data)#>警告:' guides( = FALSE) '已弃用。请使用' guides( = "none") '代替。 #> ' guides( = FALSE) '已弃用。请使用' guides( = "none") '代替。
图中显示,只有Scheid等引物主要在靶区结合,其他引物均在靶区外结合。此外,由于我们已经评估了允许脱靶结合的引物,我们发现Glas等人的正向引物似乎不靶向模板的5 '区域,而是沿着模板的长度分布,这一特性在试图扩增完整的抗体cDNA时是有害的。
为了简洁起见,我们没有为包的所有可能用途提供解释和示例。如果您想了解更多关于如何使用openPrimeR的知识,请考虑使用我们的交互式教程。该教程作为一个闪亮的应用程序提供,可以通过runTutorial ()
.