我已经被这几次困惑了,所以对于可能偶然遇到同样问题的其他人来说,这是一个虚构的问题。
考虑这个网格单元向量,
a = unit(1:3, c("cm", "in", "npc"))
我想用新值替换一些元素。自然的方法是,
a[1] = unit(2,"pt")
a
# [1] 2cm 2in 3npc
出了点问题:只更改了数值,而不是单位。为什么?怎么办?
编辑:正如下面的一个答案中所指出的,这些单位只是具有属性的数字向量。但是,它们的后代unit.arithmetic
和unit.list
也应被视为完全通用的解决方案(例如用于调整ggplot对象的面板大小)。考虑这个单位向量,
(b = a + unit(1, "npc"))
# [1] 1cm+1npc 2in+1npc 3npc+1npc
# [1] "unit.arithmetic" "unit"
现在替换特定元素更加棘手,因为它们不再是原子元素。
答案 0 :(得分:3)
在与Paul Murrell讨论之后(并且,有趣的是,重新发明了我figured out before),问题在于缺少网格单元的[<-
方法。长期的解决方案是实现这些方法,但由于网格单元带有单元,例如unit.arithmetic和unit.list,并且它们的交互很难理解,因此它并不简单。
更简单,面向用户的修复方法是将这样的单位向量转换为unit.list对象,这将继承更像常规R列表的访问器方法。可以使用未导出的函数grid:::unit.list()
完成对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
答案 1 :(得分:3)
Leading
now has a [<-.unit
method。
答案 2 :(得分:2)
看起来a
只是一个附有一些属性的原子向量。因此,当您使用a[1] = unit(2,"pt")
时,新的unit
函数会创建另一个长度为1的原子向量,该向量将替换a[1]
的值。属性保持不变。
所以,这样的事情似乎有效:
a[1] <- 2
attr(a, 'unit')[1] <- 'pt'
> a
[1] 2pt 2in 3npc