我将解释最终目标,以及我首先要尝试的测试。(因为我可能会走错路。)
我正在使用 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
还有很多其他的排列试图替代不同的东西,但你明白了。