我们可以破解 draw.triple.venn 的不可见输出所引发的 grob。
V <- draw.triple.venn(...) ## catch it in an object
使用str(v) 探索对象的结构发现它基本上是一个列表,其中一些列表对象中定义了标签。
str(V)
# [...]
# $ :List of 11
# ..$ label : chr "26030" <-- here "label"
# ..$ x : 'unit' num 0.2npc
# .. ..- attr(*, "valid.unit")= int 0
# .. ..- attr(*, "unit")= chr "npc"
# ..$ y : 'unit' num 0.739npc
# .. ..- attr(*, "valid.unit")= int 0
# .. ..- attr(*, "unit")= chr "npc"
# ..$ just : chr "centre"
# [...]
我们可以使用方括号函数`[[`() 提取它们,将它们保存在两个不同的临时对象中,然后使用所需的参数big.mark= 将它们保存在formatC 中。之后,我们将未触及的临时对象 tmp2 替换为修改后的临时对象 tmp1,其中数值不是NA。
tmp1 <- tmp2 <- lapply(V, `[[`, "label")
tmp1[sapply(lapply(V, `[[`, "label"), is.null)] <- NA
tmp1[] <- ifelse(is.na(as.numeric(tmp1)), NA,
formatC(as.numeric(tmp1), format="d", big.mark=","))
tmp2[!is.na(tmp1)] <- tmp1[!is.na(tmp1)]
最后,我们使用Map 替换grob 中用大标记修改的标签,并告诉R class 是"gList"。
V <- `class<-`(Map(`[[<-`, V, "label", tmp2), "gList")
现在,我们可以使用 grid.draw 绘制 grob。
grid.newpage()
grid.draw(V)