首页 > 解决方案 > 将参数传递给 R Phyloseq subset_taxa 包装器

问题描述

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

我正在使用 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

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

标签: rsubsetphyloseq

解决方案


gphic = subset_taxa(physeq1,  eval(as.name(level_tax)) == king_list)

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


推荐阅读