2015-12-02 17 views
5

私はこれまでに数回これに悩まされていました。だから、同じ問題につまずくかもしれない他の人たちのために作られた質問です。 グリッド単位ベクトルの要素置換

は、私が新しい値でいくつかの要素を交換したい

a = unit(1:3, c("cm", "in", "npc")) 

、このグリッド単位ベクトルを考えてみましょう。自然なアプローチは、

a[1] = unit(2,"pt") 
a 
# [1] 2cm 2in 3npc 

何かが間違っていたことになります数値のみがないユニット、変更されました。どうして?何をすべきか?

編集:以下の1つの答えで指摘したように、このような単位は属性を持つ数値ベクトルに過ぎません。しかし、その子孫unit.arithmeticunit.listは、完全に一般的な解決策(例えば、ggplotオブジェクトのパネルサイズの調整に使用する)とも考えられます。

(b = a + unit(1, "npc")) 
# [1] 1cm+1npc 2in+1npc 3npc+1npc 
# [1] "unit.arithmetic" "unit" 

ここで、特定の要素を置き換えることは、もはや原子ではないので、よりトリッキーです。

答えて

2

aのように見えるいくつかの属性を持つ原子ベクトルです。したがって、a[1] = unit(2,"pt")を使用すると、新しいunit関数は、a[1]の値を置き換える長さ1の別のアトミックベクトルを作成します。属性は変更されません。

ので、このような何かが動作しているようだ:

a[1] <- 2 
attr(a, 'unit')[1] <- 'pt' 

> a 
[1] 2pt 2in 3npc 
+0

しかし、私はあなたがすでにこれを知っていると感じています。 – LyzandeR

+0

私は答えを書いている最中でしたが、一点で立ち往生しました。あなたのアプローチは正しいですが、ユニットベクトルにunit.arithmetic: 'b = a + unit(1、" npc ")'などのより複雑な要素も含めることができるので、全面的ではないと恐れています。私は質問を編集します。 – baptiste

+0

'unit.arithmetics'でどこが間違っているのか分かります。 '[< - 'メソッドを実装することが難しいと言うなら、私はあなたを信じない理由がありません。 'unit.list'は十分な解決策のようです。 – LyzandeR

3

ポール・マレル(と、面白いことに、私はfigured out beforeをいただきたいものを再発明し)との話し合いの後、問題が無いのですグリッド単位のための[<-方法。長期的な修正はこれらのメソッドを実装することですが、グリッドユニットには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 
+0

なぜ[[< - ]プリミティブが正しいことをするのかを私に説明してください:私は[unit.listのいずれかのメソッドを見つけることができません:S](https://github.com/wch/r-source/ blob/b156e3a711967f58131e23c1b1dc1ea90e2f0c43/src/library/grid/R/unit.R) – baptiste

+0

特別な方法は必要ありません。これは、リストに適用されたときのデフォルトの動作 '<'です(そして、' unit.list'はリストです)。 –

+0

しかし、それはなぜリストですか? (またはそれがどのようにそれを見ていますか)。私はそれがisohと何か関係があると思います。原子(?) – baptiste

関連する問題