Как получить базовые данные графика МА? - PullRequest
0 голосов
/ 09 апреля 2019

Я хотел бы использовать 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"))

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

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

1 Ответ

1 голос
/ 09 апреля 2019

Глядя на код 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, чтобы полностью понять возможности этого. В частности, если вы хотите внедрить свой код не в конце (exit), а в другой позиции (возможно, из-за того, что промежуточные переменные перезаписаны и вам нужны первые результаты), для которых вам нужно будет использовать параметр at trace


Обновление

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

trace("plotMA", exit = quote(var_dump <<- mget(ls())), where = asNamespace("limma"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...