R 子集()将属性放置在向量上;如何维护/保持它们?

R 子集()将属性放置在向量上;如何维护/保持它们?,r,vector,attributes,subset,persistent,R,Vector,Attributes,Subset,Persistent,假设我有一个向量,我在其中设置了一些属性: vec <- sample(50:100,1000, replace=TRUE) attr(vec, "someattr") <- "Hello World" > vec[1:5] [1] 1 2 3 4 5 `[.foo` <- function(x, i, ...) { attrs <- attributes(x) out <- unclass(x) out <- out[i]

假设我有一个向量,我在其中设置了一些属性:

vec <- sample(50:100,1000, replace=TRUE)
attr(vec, "someattr") <- "Hello World"
> vec[1:5]
[1] 1 2 3 4 5
`[.foo` <- function(x, i, ...) {
    attrs <- attributes(x)
    out <- unclass(x)
    out <- out[i]
    attributes(out) <- attrs
    out
}

vec我将为
[
subset()
(取决于您的子集设置)编写一个方法,并安排该方法以保留属性。这将需要一个
“class”
属性也添加到您的向量中,以便进行分派

vec <- 1:10
attr(vec, "someattr") <- "Hello World"
class(vec) <- "foo"
如果我们添加一个方法
[.foo
,我们可以保留以下属性:

vec <- sample(50:100,1000, replace=TRUE)
attr(vec, "someattr") <- "Hello World"
> vec[1:5]
[1] 1 2 3 4 5
`[.foo` <- function(x, i, ...) {
    attrs <- attributes(x)
    out <- unclass(x)
    out <- out[i]
    attributes(out) <- attrs
    out
}

奖金问题的答案是:

从详细信息部分的
?“[”


子集设置(除空索引外)将删除除名称、dim和dimnames之外的所有属性。

多亏了与my@G.Grothendieck类似的答案,您可以使用
collapse::fsubset
请参见

库(折叠)
#tmp_vec 80)
tmp_vec 80)#fsubset的快捷方式
属性(tmp_vec)
#$somettr
#[1]“你好,世界”

Thx获取答案!顺便说一句,对于子集列表,在将属性传输到out之前,可以包括,
if(!is.null(attrs$names))attrs$names=names(x)[i]
也要将列表名称子集。否则可能会导致错误。现在有一个包在幕后执行此操作,尽管我不确定repo有多活跃,也有一些限制。@Hadley Wickham还详细解释了如何执行此操作,以及一个帮助器generic
sloop::Reconstructure()
来自尚未发布的软件包。最后,我刚刚在