Простая команда `paste0` не работает внутри команды` draw`?(ComplexHeatmap, r) - PullRequest
0 голосов
/ 20 апреля 2019

Как часть использования ComplexHeatmaps, мне нужно создать строку, которая позволит мне построить три карты вместе.

Если у меня есть тепловые карты A, B и C, мне понадобитсячтобы сделать это,

AllMaps <- A + B + C

draw(AllMaps)

После этого будут нарисованы все тепловые карты, A, B и C на одном холсте.

Однако, когда я пытаюсь сделать это смой список тепловых карт (где A, B и C хранятся в HeatmapList) ...

    AllMaps <- paste0("HeatmapList[['", names(HeatmapList[1]),
                       "']] + HeatmapList[['", names(HeatmapList[2]), 
                       "']] + HeatmapList[['", names(HeatmapList[3]), 
                       "']]"
                     )

    draw(AllMaps)

Сбой, и я получаю следующее сообщение:

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘draw’ for signature ‘"character"

Странно, если я тогда просто запускаю AllMaps Я получаю:

"HeatmapList[['A']] + HeatmapList[['B']] + HeatmapList[['C']]"

Отображение paste0 правильно распечатывает мой список имен объектов.Затем, если я скопирую и вставлю этот вывод прямо в draw, это сработает!например,

#This works
draw(HeatmapList[['A']] + HeatmapList[['B']] + HeatmapList[['C']])

Так что же paste0 делает с draw, чего он не делает, когда я просто запускаю его сам?

Вот пример, если вы хотите запустить его иубедитесь сами:

#Get the most recent ComplexHeatmaps Package
library(devtools)
install_github("jokergoo/ComplexHeatmap", force = TRUE)
library(ComplexHeatmap)


#Make Example Matrices
Matrices = list()

Matrices[['Mtx1']] <- matrix(  c(2, 4, 5, 7), nrow=2, ncol=2, dimnames = list(c("Row1", "Row2"), c("C.1", "C.2"))) 
Matrices[['Mtx2']] <- matrix(  c(5, 1, 3, 9), nrow=2, ncol=2, dimnames = list(c("Row1", "Row2"), c("C.1", "C.2"))) 
Matrices[['Mtx3']] <- matrix(  c(8, 3, 7, 5), nrow=2, ncol=2, dimnames = list(c("Row1", "Row2"), c("C.1", "C.2"))) 

#Create Heatmaps
HeatmapList = c()

HeatmapList <- lapply(Matrices, function(q) {
  Heatmap(q, name = "a_name") 
})

names(HeatmapList) <- c('A', 'B', 'C')

#Draw a heatmap to check it's all working
draw(HeatmapList[[2]])

#Create Heatmap string so A, B and C can all be plotted together
AllMaps <- (paste0("HeatmapList[['", names(HeatmapList[1]), "']] + ",
                   "HeatmapList[['", names(HeatmapList[2]), "']] + ",
                   "HeatmapList[['", names(HeatmapList[3]), "']]" ))

#Draw using the string we just made --> DOESN"T WORK!
draw(AllMaps)

#Check the string --> LOOKS FINE, JUST AS IT SHOULD BE 
paste0(AllMaps)

# Copy and paste string manually into draw command --> THIS WORKS
draw(HeatmapList[['A']] + HeatmapList[['B']] + HeatmapList[['C']])

#SO WHY DOES THIS FAIL???
draw(AllMaps)

1 Ответ

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

AllMaps является простой строкой, и когда вы передаете ее в функцию draw вместо того, чтобы воспринимать ее как объект HeatmapList, она оценивает ее как символ и, следовательно, выдает сообщение об ошибке. Одним из вариантов является использование eval(parse(text для оценки строки как HeatmapList object

draw(eval(parse(text = AllMaps)))

Хотя это работает, но использование eval(parse обычно не рекомендуется.

Если вы отметите class из AllMaps, это будет символ

class(AllMaps)
#[1] "character"

и если вы проверите

class(HeatmapList[['A']] + HeatmapList[['B']] + HeatmapList[['C']])

#[1] "HeatmapList"
#attr(,"package")
#[1] "ComplexHeatmap"

поэтому нам нужно привести эти отдельные объекты в класс HeatmapList.

Мы можем использовать простой for цикл

HeatmapList = c()

for (i in seq_len(length(Matrices))) {
  HeatmapList = HeatmapList + Heatmap(Matrices[[i]], name = "a_name") 
}

и теперь используйте draw метод для HeatmapList, который даст нам ожидаемый результат

draw(HeatmapList)

enter image description here

...