如何使用循环来更改变量

时间:2018-04-25 15:38:40

标签: r bioinformatics biomart

有没有办法使用循环来编写这段代码?除了物种名称

之外,每行代码都是相同的
ensembl_hsapiens <- useMart("ensembl", 
                        dataset = "hsapiens_gene_ensembl")
ensembl_mouse <- useMart("ensembl", 
                     dataset = "mmusculus_gene_ensembl")
ensembl_chicken <- useMart("ensembl",
                       dataset = "ggallus_gene_ensembl")

1 个答案:

答案 0 :(得分:2)

这是一种方法。请注意,使用循环(或循环等效构造)来填充全局环境通常不是一个好主意。但这就是你要求的。

useMart没有什么特别之处,所以我将构成一个带有两个字符参数的无意义函数:

foo <- function(x, y) {
  nchar(paste(x, y))
}

以下是物种名称。我也会将它们用作对象名称。

species <- c("hsapiens", "mmusculus", "ggallus")           

现在,您想在全局环境中创建三个命名对象。您可以使用assign函数,注意您使用pos=2,因为lapply的每个循环都在自己的环境中完成。

lapply(species, function(s) assign(paste0("ensembl_", s),
                                   foo("ensemble", paste0(s, "_gene_ensembl")),
                                   pos = 1))

这可以满足您的需求。您可以替换foo使用useMart

现在,这是个好主意吗?也许不是。我更倾向于将对象本身保存在列表中。

objs <- lapply(species, function(s) foo("ensemble", paste0(s, "_gene_ensembl")))
names(objs) <- paste0("ensemble_", species)

您可以使用objs$ensemble_hsapiensobjs[["ensemble_hsapiens"]]

等语句来访问它们