3

我有一个一般性问题,我认为这可以归结为某种范围界定问题。

下面是使用 biomaRt 的 getSequence() 函数的公式片段。用户输入自定义函数 (1) 基因名称,以及可选的 (2) 上游要导入的碱基对数。

# Load libraries
library(biomaRt)
# Let's make a custom "getSequence" function
getUpstream <- function(x, bp.upstream = 50){
    bp.upstream <- bp.upstream
    ensembl <- useMart("ensembl", dataset = "hsapiens_gene_ensembl")
    upstream.master <- NULL
    for(i in x){
        upstream.i <- getSequence(id = i,
            type = "hgnc_symbol",
            seqType = "coding_gene_flank",
            upstream = bp.upstream,
            mart = ensembl
        )
        upstream.master <- rbind(upstream.master, upstream.i)
    }
    return(upstream.master)
}

假设我使用此函数运行搜索,但未指定上游碱基对的数量,例如:

getUpstream("NOTCH4")

出乎意料的是,如果没有该行,该功能将无法工作:

bp.upstream <- bp.upstream

其他行如 print(bb.upstream) 也会使代码工作。

我认为 bp.upstream 会在我调用该函数时被定义,因此一旦调用 getSequence 就会设置 upstream=50 。谁能帮我理解为什么不呢?

4

1 回答 1

1

这是避免范围问题的解决方法。

# Load libraries
library(biomaRt)
# Let's make a custom "getSequence" function
 getUpstream <- function(x, bp.upstream = 50){
  ensembl <- useMart("ensembl", dataset = "hsapiens_gene_ensembl")
  upstream.master <- lapply(x, function(i,stream)
                         getSequence(id = i,
                              type = "hgnc_symbol",
                              seqType = "coding_gene_flank",
                              upstream = stream,
                              mart = ensembl),stream=bp.upstream)


  upstream.master
}
于 2013-10-16T04:44:19.577 回答