Как получить подчиненные данные графика MA?

#r #limma

#r #лимма

Вопрос:

Я хотел бы использовать plotMA функцию limma .

Пример документации работает нормально:

 A <- runif(1000,4,16)
y <- A   matrix(rnorm(1000*3,sd=0.2),1000,3)
status <- rep(c(0,-1,1),c(950,40,10))
y[,1] <- y[,1]   status
plotMA(y, array=1, status=status, values=c(-1,1), hl.col=c("blue","red"))
  

Теперь я хотел бы получить доступ к базовым данным, которые используются для графика, поскольку я хотел бы использовать данные в другом контексте, а не только в графике. В настоящее время я не вижу способа получить доступ к данным; конечно, я мог бы сам реализовать метод и использовать только данные, но это кажется неправильным.

Есть ли способ получить доступ к базовым данным, используемым для графика MA?

Ответ №1:

Глядя на код plotMA , мы видим, что для построения графика создается и используется несколько переменных. Однако эти переменные не возвращаются.

Теперь вы можете скопировать и вставить функцию, чтобы написать свою собственную функцию, которая отображает и возвращает данные. Однако это может привести к ошибкам, если есть новая версия функции, вы можете полагаться на старый код.

Итак, что вы можете сделать вместо этого, это использовать trace для вставки произвольного кода, в plotMA частности, в некоторый код, который хранит данные в вашей глобальной среде. Я иллюстрирую идею на примере игрушки:

 f <- function(x) {
   y <- x   rnorm(length(x))
   plot(x, y)
   invisible()
}
  

Если мы хотели бы использовать y в этой функции, мы могли бы сделать что-то вроде этого

 trace(f, exit = quote(my_y <<- y))
# [1] "f"
ls()
# [1] "f"
f(1:10)
# Tracing f(1:10) on exit 
ls()
# [1] "f"    "my_y"
  

И теперь мы можем получить доступ my_y .

Что вы должны сделать:

  1. Посмотрите на код plotMA
  2. Определите, какая часть данных вам нужна (например x , y и sel )
  3. Использовать trace(plotMA, exit = quote({my_data <<- list(x, y, sel)}), where = asNamespace("limma"))
  4. Выполнить plotMA
  5. Доступ к данным через my_data

Примечание.Ознакомьтесь, ?trace чтобы полностью понять его возможности. В частности, если вы хотите ввести свой код не в end ( exit ), а в другой psoition (возможно, потому, что промежуточные переменные перезаписываются, и вам нужны первые результаты), для которых вам нужно будет использовать at параметр trace


Обновить

Может быть, проще всего получить полный дамп всех локальных переменных, определенных в функции:

 trace("plotMA", exit = quote(var_dump <<- mget(ls())), where = asNamespace("limma"))
  

Комментарии:

1. Хорошо, попробую это, а затем свяжусь с вами, если мне удастся (проголосовать / принять).

2. Глупый вопрос, но какой самый быстрый способ просмотреть исходный код? Я попробовал limma::plotMA и несколько других вариантов, но безуспешно. Как вы это сделали?

3. Я даже не мог установить библиотеку limma в первую очередь, но я посмотрел код на GitHub

4. Причина, по которой я не смог его установить: Depends: R (<= 2.5.1) , какую древнюю R версию вы используете? :-O

5. Я сделал обновление, возможно, самым безопасным будет сохранить все локальные переменные в списке, а затем просто взять те, которые вам нужны