0

我的目标是使用 lapply 或类似地 mapply 将列表作为参数传递给函数 geom_point2。在类似的情况下,我成功地将一个列表(或多个列表)传递给 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)))))

在此处输入图像描述

4

1 回答 1

2

这是一个调用 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-environment 中而不是传递给绘图的变量有关。

PS:很抱歉我之前对 do.call() 的回答太快了。它很有用,但在这里跑题了。

于 2017-11-02T19:44:35.913 回答