有没有办法使用循环来编写这段代码?除了物种名称
之外,每行代码都是相同的ensembl_hsapiens <- useMart("ensembl",
dataset = "hsapiens_gene_ensembl")
ensembl_mouse <- useMart("ensembl",
dataset = "mmusculus_gene_ensembl")
ensembl_chicken <- useMart("ensembl",
dataset = "ggallus_gene_ensembl")
答案 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_hsapiens
或objs[["ensemble_hsapiens"]]