Передача аргументов в geom_point2 с помощью mapply

Моя цель - передать списки в качестве аргументов функции geom_point2, используя lapply или аналогично mapply. В подобных ситуациях я успешно передавал список (или списки) в geom_cladelabel как в:

mapply(function (x,y,z,w,v,u,t,s) geom_cladelabel(node=x, label=y,
align=F, etc. # Where x y z etc are lists. 

Проблема связана с использованием aes внутри geom_point2. (не в geom_cladelabel):

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

Цель состоит в том, чтобы заставить этот пример работать, но используя mapply вместо того, чтобы писать geom_point2 два раза.

# source("https://bioconductor.org/biocLite.R")
# biocLite("ggtree")
library(ggtree)
library(ape)
#standard code
newstree<-rtree(10)
node1<-getMRCA(newstree,c(1,2))
node2<-getMRCA(newstree,c(3,4))
ggtree(newstree)+ 
geom_point2(aes(subset=(node ==node1) ), fill="black", size=3, shape=23)+
geom_point2(aes(subset=(node ==node2) ), fill="green", size=3, shape=23)

#desire to substitute the geom_point2 layers with mapply or lapply:
#lapply(c(node1,node2), function (x) geom_point2(aes(subset=(node=x)))))

1 ответ

Решение

Вот решение, вызывающее geom_point2 usig mapply:

library(ggtree)
ggtree(rtree(10)) + 
  mapply(function(x, y, z) 
    geom_point2(
      aes_string(subset=paste("node ==", x)), 
      fill=y, 
      size=10, 
      shape=z
    ), 
    x=c(11,12), 
    y=c("green", "firebrick"), 
    z=c(23,24)
  ) +
  geom_text2(aes(subset=!isTip, label=node)) 

Решение в aes_string(), который записывает значение x прямо в эстетике. По умолчанию aes() не передает значение x, а только строку "x", При построении графика ggtree ищет узел с именем "x" и заканчивается пустым списком узлов. Я думаю, это связано с переменной, хранящейся в mapply- окружающая среда и не передаваемая на участок.

PS: извините за мой слишком быстрый ответ с do.call() ранее. Это полезно, но не по теме здесь.

Другие вопросы по тегам