1

我是 R 的初学者,我有一个看起来像这样的功能代码

library(VennDiagram)
grid.newpage()
draw.triple.venn(area1=49644, area2=38697, area3=33281, n12=14221, n23=11026,
                 n13=13635, n123=4242, category=c("DOGS", "CATS", "HORSES"), 
                 cex=1.6, cat.cex=1.8, lwd=2, fill=c("blue", "pink1", "grey50"))

我想为大数字添加逗号分隔符,但不知道如何添加 prettyNum 或一些类似的功能。有人可以帮我吗?

4

1 回答 1

0

我们可以破解draw.triple.venn.

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"
# [...]

我们可以使用括号函数提取它们`[[`(),将它们保存在两个不同的临时对象中,并formatC使用所需的参数big.mark=。之后,我们将未触及的临时对象替换为数值为非tmp2的修改过的临时对象。tmp1NA

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

最后,我们用 grob 中的大标记替换修改过的标签,Map并告诉 Rclass"gList"

V <- `class<-`(Map(`[[<-`, V, "label", tmp2), "gList")

现在,我们可以使用grid.draw.

grid.newpage()
grid.draw(V)

在此处输入图像描述

于 2020-04-10T06:59:33.780 回答