どうやら、属性のあるリストにインデックスを付けると、属性のないリストが返されます。
> l <- list(a=1:3, b=7)
> attr(l, 'x') <- 67
> l
$a
[1] 1 2 3
$b
[1] 7
attr(,"x")
[1] 67
> l[c('a','b')]
$a
[1] 1 2 3
$b
[1] 7
属性はなくなりました。属性を保持しながらリストにインデックスを付けることは可能ですか?
どうやら、属性のあるリストにインデックスを付けると、属性のないリストが返されます。
> l <- list(a=1:3, b=7)
> attr(l, 'x') <- 67
> l
$a
[1] 1 2 3
$b
[1] 7
attr(,"x")
[1] 67
> l[c('a','b')]
$a
[1] 1 2 3
$b
[1] 7
属性はなくなりました。属性を保持しながらリストにインデックスを付けることは可能ですか?
これがそのようなサブセット関数です。'names'属性を上書きしようとしないことが重要であることに注意してください。
subset.with.attributes <- function(X, ...) {
l <- X[...]
attr.names <- names(attributes(X))
attr.names <- attr.names[attr.names != 'names']
attributes(l)[attr.names] <- attributes(X)[attr.names]
return(l)
}
> subset.with.attributes(l, c('a','b'))
$a
[1] 1 2 3
$b
[1] 7
attr(,"x")
[1] 67
単純に属性を割り当てようとすると、実際にサブセット化を行った場合、サブセットは失敗します。
> subset.with.attributes(l, c('b'))
$b
[1] 7
attr(,"x")
[1] 67
sticky
パッケージを使用してください。それはまさにこの目的のために設計されました。(完全開示:私はパッケージの作成者です。)使い方は簡単です。sticky()
ベクター/リストなどを呼び出すだけです。例えば:
> l <- list(a=1:3, b=7)
> attr(l, 'x') <- 67
> l <- sticky(l)
> attr(l,'x')
> [1] 67
>
> class(l)
> [1] "sticky" "list"