如何使用循环修改变量?能否用循环改写重复的useMart代码?
嘿,好问题!咱们先逐个来解决:
一、如何用循环修改变量/创建变量
首先得明确:用循环处理变量时,优先用列表来存储结果,而不是直接创建一堆零散的单个变量——后者不仅容易让你的工作环境变得杂乱,后期维护也麻烦。
举个简单的例子:如果你想循环生成多个计算结果,或者像你那样创建多个ensembl对象,用列表是最规范的方式。当然,如果你非要生成单独的变量(不推荐),可以用assign()函数,但还是强烈建议用列表统一管理。
二、你的重复代码完全可以用循环改写!
你给出的三段代码逻辑完全一致,只是dataset参数的物种名称不同,这种场景正是循环发挥作用的绝佳时机。这里推荐用R里处理重复任务的常用函数lapply(),步骤如下:
步骤1:整理需要处理的物种数据集名称
先把所有要用到的dataset名称放到一个向量里:
species_datasets <- c( "hsapiens_gene_ensembl", "mmusculus_gene_ensembl", "ggallus_gene_ensembl" )
步骤2:用循环生成ensembl对象列表
用lapply()遍历这个向量,每次调用useMart()创建对应的对象,结果会自动存成一个列表:
ensembl_list <- lapply(species_datasets, function(dataset) { useMart("ensembl", dataset = dataset) })
步骤3:给列表命名(可选但推荐)
为了方便后续调用,可以给列表的每个元素起个好记的名字,比如对应物种简称:
names(ensembl_list) <- c("hsapiens", "mouse", "chicken")
之后你想调用人类的ensembl对象,就用ensembl_list$hsapiens,和你原来的ensembl_hsapiens用法完全一样,但所有对象都整齐地放在一个列表里,管理起来更轻松。
(可选)如果一定要生成单独的变量
如果你坚持要得到像ensembl_hsapiens这样的单个变量,可以用list2env()把列表转成环境中的变量,但还是提醒你:这种方式会让你的工作区多出零散变量,变量多了很容易混乱,不推荐:
list2env(ensembl_list, envir = .GlobalEnv)
这样改写后,你如果要添加新的物种,只需要在species_datasets向量里加一行新的dataset名称就行,不用再复制粘贴整段代码,维护起来省心多了!
内容的提问来源于stack exchange,提问作者Jack Dean

