修改未打开的gList列表

时间:2013-04-16 14:13:04

标签: r

如果我有一个我尚未绘制的gList,我可以修改其中的文本。

示例:

library('VennDiagram')
temp <- venn.diagram(list(A=0,B=0),euler.d=FALSE, scale=FALSE, filename=NULL)

这里的temp是一个未开槽的gList,我可以用

绘图
grid.draw(temp)

但是如果我想在绘制之前修改文本对象(包括nubers),但是在创建gList对象之后。例如,我可以在创建gList后更改维恩图中的值吗?

我知道如果先绘制维恩图,我可以用grid.edit()来做,但这不是一个选项。

str(temp)

这是我想改变的.. $标签。

提前 - 谢谢。

2 个答案:

答案 0 :(得分:1)

你可以做到,但这有点像黑客。此外,我不知道您是否可以一次按多个元素对列表进行子集化,因此您可能需要单独手动更改每个标签。基本上,我检查了该情节,然后查看了temp对象的结构,并找到了对象中存储标签的位置。然后,我获得了列表元素的索引,这些索引实际上是文本对象,并使用子集来将这些元素编辑到其他位置。唯一的问题是我发现我必须一次做每一个,如果你有很多,这是一个痛苦。你可以尝试这个,我希望它有所帮助:

unlist( sapply(temp,'[[',"label") )
[1] "0" "0" "1" "A" "B"

# Make index of which top-level elements of list are text elements
x <- !sapply( sapply(temp,'[[',"label") , is.null )
ind <- seq.int(length(x))
ind <- ind[x]


# Subset and change each one in place
`[[`(`[[`( temp , ind[1] ), "label") <- "WAS"
`[[`(`[[`( temp , ind[2] ), "label") <- "BY"
`[[`(`[[`( temp , ind[3] ), "label") <- "CHANGED"
`[[`(`[[`( temp , ind[4] ), "label") <- "THIS"
`[[`(`[[`( temp , ind[5] ), "label") <- "ME"

# Plot with new labels
grid.draw(temp)

enter image description here

答案 1 :(得分:1)

不幸的是,该软件包不遵循网格建议,以便通过名称等方便地访问grob。

在交互式会话中,您可以使用grid.ls()在显示列表中找到名称,您可以执行以下操作:

venn <- gTree(children=temp, name="venn")
grid.edit("venn::GRID.text.17", label="this is a new label")

(显然17在给定状态下我的会话是唯一的;未命名的grob由网格自动索引)

如果存在一致(可重现)的命名方案,您可以使用gTree方法定义自己的gList包裹editDetails,以递归方式编辑子标签。