2017-08-03 1 views
0

私の目的は、lapplyまたはそれに類似したmapplyを使って関数geom_point2への引数としてのパスリストです。同様の状況で、私はのようにgeom_cladelabelするリスト(またはリスト)を渡す成功を収めて:mapplyを使ってgeom_point2に引数を渡す

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. 

問題がgeom_point2内部aesの使用に関連しています。 (geom_cladelabelにはない):

geom_point2の場合、ノード情報はaesであり、できません。通常、エラーメッセージは表示されませんが、動作しません。

目的はこの例を動作させることですが、geom_point2を2回書き込む代わりにmapplyを使用します。ここで

# 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))))) 

enter image description here

+2

サンプル入力データを使って[再現可能な例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)を提供すると、コードを実行してテストすることができます。 – MrFlick

+0

'getMRCA'関数はどこから来ますか? – MrFlick

+0

パッケージエイプ – Ferroao

答えて

2

mapply geom_point2 usigを呼び出すソリューションです:

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)) 

ソリューションは美学で直接xの値を書き込みaes_string()、です。デフォルトのaes()は、xの値を渡すのではなく、文字列"x"だけを渡します。プロットするとき、ggtreeは "x"というノードを探し、空のノードリストで終わります。 これは、変数がmapply環境に格納されていて、プロットに渡されていないことが関係していると思います。

PS:do.call()で私の早すぎる答えが早すぎるため申し訳ありません。これは便利ですが、ここで話題にはなりません。

+0

解答の横に何らかの説明を追加してください。これは完璧な解決法を提供する素晴らしいコードかもしれませんが、何らかの説明がなくても裏付けの証拠がなく、他の人が何が起こっているのかを知ることが難しくなります。 –

+1

ありがとう@PhillHealeyこれを指摘してください。最初の答えは素早く推測でした。今調整しました。 – RaphiS

関連する問題