我已经对此感到困惑好几次了,所以这里为其他可能偶然发现同样问题的人提出了一个虚构的问题。
考虑这个网格单位向量,
a = unit(1:3, c("cm", "in", "npc"))
我想用新值替换一些元素。自然的方法是,
a[1] = unit(2,"pt")
a
# [1] 2cm 2in 3npc
出了问题:仅更改了数值,而未更改单位。为什么?该怎么办?
Edit:正如下面的一个答案所指出的,这些单位只是带有属性的数值向量。然而他们的后代unit.arithmetic
and unit.list
还应该被认为是完全通用的解决方案(例如用于调整 ggplot 对象的面板大小)。考虑这个单位向量,
(b = a + unit(1, "npc"))
# [1] 1cm+1npc 2in+1npc 3npc+1npc
# [1] "unit.arithmetic" "unit"
现在替换特定元素更加棘手,因为它们不再是原子的。
在与保罗·默雷尔(Paul Murrell)讨论之后(有趣的是,重新发明了我想要的东西)之前就想通了 https://stackoverflow.com/questions/32580946/setting-absolute-size-of-facets-in-ggplot2/32583612#32583612),问题在于没有[<-
网格单元的方法。长期的解决方案是实现这些方法,但这并不是微不足道的,因为网格单元带有兄弟单元,例如unit.arithmetic和unit.list,并且它们的交互可能变得难以理解。
更简单、面向用户的修复方法是将此类单位向量转换为 unit.list 对象,该对象将继承一个更像常规 R 列表的访问器方法。可以使用未导出的函数来完成对unit.list对象的提升grid:::unit.list()
.
a = unit(1:3, c("cm", "in", "npc"))
b = grid:::unit.list(a)
is.list(b) # check that indeed this is a list object, thanks @Josh O'Brien
# [1] TRUE
# so now we can use standard list methods
b[[1]] = unit(2,"pt")
b
#[1] 2pt 2in 3npc
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)