【问题标题】:Pass arguments to the R Phyloseq subset_taxa wrapper将参数传递给 R Phyloseq subset_taxa 包装器
【发布时间】:2019-09-22 03:01:47
【问题描述】:

我将首先解释最终目标,以及我正在尝试的测试。 (因为我可能会走错路。)

我正在使用 phyloseq 包来可视化微生物组数据。我想通过让用户选择分析级别并让我的脚本在没有人手动输入每个组合的情况下生成可视化来在一定程度上“自动化”它。

问题是将变量传递给子集函数。我主要得到这些错误(取决于我尝试过的 paste0、eval、parse、as.logical、expression、noquote 等的组合):

Error in subset.data.frame(oldDF, ...) : 'subset' must be logical
Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

用户可以设置分析级别。所以让我们说现在有两个级别,自动选择第二个级别意味着你也想要第一个级别。 (我还没有研究过那部分,但我想提前解释一下。

#Set lineage level
lin_level <- 1
lin_list <- c("k__Kingdom", "p__Phylum","c__Class", "o__Order","f__Family")
lin_select <- lin_list[lin_level]
sub_lin <- lin_list[(lin_level +1)]

#Kingdom
king_list <- "k__Bacteria"

#set Phylum list
if (lin_select == "p__Phylum"){
phylum_list <- c("p__Firmicutes","p__Proteobacteria","p__Bacteroidetes","p__Actinobacteria","p__Tenericutes")
}

subgroup <- "All"

从这里开始,脚本最终会到达图形部分。如果 lin_level 设置为 1,它将如下所示:

FIXED
gphic = subset_taxa(physeq1, Kingdom=="k__Bacteria")
title = paste0(subgroup," ", "Bacteria-only")
plot_bar(gpsfb, "Phylum", "Abundance", "Phylum", 
         title=title, facet_grid="Type~.")

AUTOMATED
gphic = subset_taxa(physeq1, (substring(lin_select,4)) == king_list)
title = paste0(subgroup," ", (substring(king_list,4)),"-only")
plot_bar(gpsfb, (substring(sub_lin,4)), "Abundance", (substring(sub_lin,4)), 
         title=title, facet_grid="Type~.")

但是,尝试将 (substring(lin_select,4)) == king_list 作为参数传递会导致错误。

我已经搜索了有关此问题的各种主题,但无法获得不同的答案。最终,我需要为 Kingdom 运行一次绘图部分,然后每次为 Phylum 列表中的每个项目运行一次。但在我到达那里之前,我需要能够将参数传递给子集函数。

我尝试过的事情:

test <- paste0(substring(lin_select,4),"==","\"","p__Bacteroidetes","\"")
noquote(test)
[1] Phylum=="p__Bacteroidetes"

gphic = subset_taxa(physeq1, noquote(test))
Error in subset.data.frame(oldDF, ...) : 'subset' must be logical

gphic = subset_taxa(physeq1, paste0(substring(lin_select,4),"==","\"","p__Bacteroidetes","\""))
Error in subset.data.frame(oldDF, ...) : 'subset' must be logical

gphic = subset_taxa(physeq1, as.logical(test))
Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

as.logical(noquote(test))
[1] NA

gphic = subset_taxa(physeq1, as.logical(noquote(test)))
Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

noquote(test)
[1] Phylum=="p__Bacteroidetes"

as.logical(noquote(test))
[1] NA

as.logical(as.character(noquote(test)))
[1] NA

test2 <- eval(parse(text= test))
Error in eval(parse(text = test)) : object 'Phylum' not found

test2 <- eval(test)
gphic = subset_taxa(physeq1, as.logical(test2))
Error in dimnames(x) <- dn : 
  length of 'dimnames' [1] not equal to array extent

as.logical(test2)
[1] NA

还有很多其他的排列试图替代不同的东西,但你明白了。

【问题讨论】:

    标签: r subset phyloseq


    【解决方案1】:
    gphic = subset_taxa(physeq1,  eval(as.name(level_tax)) == king_list)
    

    这里,level_tax 是循环中的变量。说 level_tax = "Order",然后我们将字符串 "Order" 通过 as.name(level_tax) 或 as.symbol 转换成变量名(level_tax)。然后我们使用 eval(),它接受一个表达式并在指定的环境中进行计算

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2013-04-24
      • 2017-07-13
      • 1970-01-01
      • 2014-11-17
      • 1970-01-01
      • 2018-08-24
      • 2014-10-01
      相关资源
      最近更新 更多