【问题标题】:How to get rid of "" object name and working in loop?如何摆脱“”对象名称并循环工作?
【发布时间】:2011-09-22 19:12:44
【问题描述】:

我不知道如何精确定义这个问题;但我想不通

    genx <- list(scaffold_1 = c("AAATTTTTATAT"),scaffold_2 = c("AAATTTTTATAT"),
    scaffold_3 = c("AAATTTTTATAT"),scaffold_4 = c("AAATTTTTATAT"),
    scaffold_5 = c("AAATTTTTATATA"),scaffold_6 = c("AAATTTTTATAT"),
scaffold_7 = c("AAATTTTTATAT"),scaffold_8 = c("AAATTTTTATATA"))


TATA = "TATA"   
      myobs <- paste("genx$scaffold_", 1:8, sep = "")

我想将以下函数应用于 myobs 元素(是对象)的每个元素:

source("http://www.bioconductor.org/biocLite.R")

biocLite("Biostrings")
require((Biostrings)

countPattern (TATA, genx$scaffold_1, max.mismatch = 1)
[1] 3  

当我使用以下内容时:

countPattern (TATA, myobs[1], max.mismatch = 1)

不工作,我认为解释为:

countPattern (TATA, "genx$scaffold_1", max.mismatch = 1)
 [1] 0 

这和上面的不一样。如何摆脱“”并创建一个循环来执行这项工作,感谢您的建议:

【问题讨论】:

    标签: r loops


    【解决方案1】:

    您可以直接使用列表并执行sapply,它作用于列表的每个元素。这是一些示例代码

    sapply(genx, countPattern, pattern = TATA, max.mismatch = 1)
    

    【讨论】:

    • 请注意,此解决方案给出的值如下:countPattern (TATA, "genx$scaffold_1", max.mismatch = 1) [1] 0 但我的预期是 [1] 3 .... ..这是countPattern (TATA, genx$scaffold_1, max.mismatch = 1)的结果
    • 我在新窗口中再次尝试了此选项,但得到了我的答案!令人惊讶......我不知道发生了什么......对此感到抱歉......感谢两位的帮助......
    • 很高兴它成功了。 @Tomas 的回答比我的要透明一点。所以如果你想继续接受他的回答,我会完全没问题的。
    【解决方案2】:

    你可以使用get函数

    a  <- 12
    get("a") # returns 12
    

    【讨论】:

    • 感谢您的帮助...但我可以了解如何部署此功能..我有限的 R 知识...
    【解决方案3】:

    这个呢:

    sapply(genx, function (x) { countPattern(TATA, x, max.mismatch = 1) })
    

    【讨论】:

    • @Ramnath,你确定吗?关键参数在第二个位置,所以我认为你不能写成sapply(genx, countPattern, pattern = TATA, max.mismatch = 1)。约翰的投诉不是和这个有关吗?
    • 认为这无关紧要,因为其他参数是按名称标识的。我无法安装biostrings,所以你能运行我拥有的代码并告诉我它提供了什么输出吗?
    • 对不起,伙计们,当我最初粘贴 Ramnath 代码时,我得到了所有 0 个结果,但现在在新窗口中它可以工作了......我不确定代码的差异......谢谢你们俩帮助...
    • @Ramnath,谢谢你教我一些新东西,我不知道它可以这样工作!伟大的!我发现您的解决方案比我的更优雅。约翰,请随意接受 Ramnath 的回答 :-)
    【解决方案4】:

    有问题:

    get("genx$scaffold_1")
    

    因为 R 认为您正在寻找具有该全名的对象,而不是 'genx' 的 'scaffold_1' 组件。

    应该起作用的是:

    eval(parse(text="genx$scaffold_1"))
    

    但请看:

    fortune(106)
    

    更多麻烦点可以在“The R Inferno”中找到:http://www.burns-stat.com/pages/Tutor/R_inferno.pdf

    【讨论】:

      【解决方案5】:

      我建议你将genx$scaffold定义为向量,然后你就可以轻松使用apply函数了:

      genx = data.frame(scaffold = c(1, 2, 3, 4)) # genx$scaffold is a vector
      

      现在您可以轻松地在每个 genx$scaffold 的元素上运行 countPattern() 函数

      apply(as.matrix(genx$scaffold), 1, 
          function (x) { countPattern(TATA, x, max.mismatch = 1) })
      

      您可以轻松扩展解决方案,以便 genx$scaffold 也可以是矩阵等。

      【讨论】:

      • 请看我对问题的改进版本,我没有将 genx..scaffold_1 更改为scaffold_8 无法分离的奢侈...感谢您的帮助..
      • 然后使用 Karsten 发布的 get() 解决方案。但我仍然建议将列表转换为简单向量。它将简化您未来的许多任务!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多