【问题标题】:How to use a loop to change a variable [duplicate]如何使用循环来更改变量[重复]
【发布时间】:2018-04-25 15:38:39
【问题描述】:

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

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

【问题讨论】:

  • lapply(setNames(, c("hsapiens", "mmusculus", "ggallus")), function(x) useMart("ensembl", dataset = sprintf("%s_gene_ensembl", x))) 也许吧。

标签: r bioinformatics biomart


【解决方案1】:

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

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))

这会给你你想要的。你可以用useMart替换foo

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

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

您可以使用 objs$ensemble_hsapiensobjs[["ensemble_hsapiens"]] 等语句访问它们

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2014-12-07
    • 2014-10-06
    • 2018-08-10
    • 2014-04-15
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多