Передать аргументы в оболочку R Phyloseq subset_taxa - PullRequest
0 голосов
/ 03 мая 2019

Я объясню конечную цель и то, что я пробую в качестве теста в первую очередь.(Потому что я, вероятно, поступаю неправильно).

Я использую пакет phyloseq для визуализации данных микробиома.Я хочу до некоторой степени «автоматизировать» его, заставляя пользователей выбирать уровни анализа и заставлять мой сценарий генерировать визуализации без того, чтобы кто-то вручную печатал в каждой комбинации.

Проблема заключается в передаче переменных в функцию подмножества.Я получаю эти ошибки в первую очередь (в зависимости от того, какие комбинации pas0, 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 в качестве аргумента возникает ошибка.

Я искал в различных потокахпо этому вопросу, но я не смог получить разные ответы для работы. В конечном счете мне нужно запустить графическую секцию один раз для Королевства, а затем снова каждый раз для каждого элемента в списке Типа. Но прежде чем я смогу туда добраться,Мне нужно иметь возможность передавать аргументы в функцию подмножества.

Вещи, которые я пробовал:

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

И множество других перестановок, пытающихся перейти в разные вещи, но выполучить представление.

1 Ответ

0 голосов
/ 12 июля 2019
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 () , который принимает выражение и вычисляет в указанной среде

...