-1

有没有办法使用循环来编写这段代码?除了物种名称之外,每一行代码都是相同的

ensembl_hsapiens <- useMart("ensembl", 
                        dataset = "hsapiens_gene_ensembl")
ensembl_mouse <- useMart("ensembl", 
                     dataset = "mmusculus_gene_ensembl")
ensembl_chicken <- useMart("ensembl",
                       dataset = "ggallus_gene_ensembl")
4

1 回答 1

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"]]

于 2018-04-25T16:37:13.863 回答