在递归列表中设置chr类型的元素的属性

时间:2013-03-14 01:07:07

标签: r

我很困惑为什么以下代码可以设置属性

#list of character
temp = list()
temp[[1]] = "test"
str(temp)
attr(temp[[1]], "testing") = "try"
attributes(temp[[1]])

返回

$testing
[1] "try"

但是当我尝试在命名列表中设置元素的属性时,请使用

#list of character, where list element is named
temp = list()
temp[["2ndtemp"]][[1]] = "test"
str(temp)
attr(temp[["2ndtemp"]][[1]],"testing") = "try"
attributes(temp[["2ndtemp"]][[1]])

这会返回NULL

然后我发现如果你声明一个递归列表:

#list of a list
temp = list()
temp[["2ndtemp"]] = list()
temp[["2ndtemp"]][[1]] = "test"
str(temp)
attr(temp[["2ndtemp"]][[1]],"testing") = "try"
attributes(temp[["2ndtemp"]][[1]])

有效

进一步探索:

#character vector
temp = "test"
str(temp)
attr(temp,"testing") = "try"
attributes(temp)

也适用,但如果我有一个包含字符的向量:

temp=vector()
temp[[1]] = "test"
str(temp)
attr(temp[[1]],"testing") = "try"
attributes(temp[[1]])

这会返回NULL

有人可以向我解释为什么attr()函数在这些情况下的工作方式不同吗?

编辑:我对最后一对例子非常困惑,因为如果我设置:

temp = "test"
temp2=vector()
temp2[[1]] = "test"

然后查询:

identical(temp,temp2[[1]])

我得到TRUE

1 个答案:

答案 0 :(得分:2)

你所有的例子都做不同的事情。

temp = list()
temp[["2ndtemp"]][[1]] = "test"

这会创建一个字符向量,空对象上的[[<-不会创建列表

x <- NULL
x[[1]] <- 'x'
 x
[1] "x"

在使用vector的示例中,您在调用mode时使用vector()的默认值,即vector(mode = "logical", length = 0)

因此,当您指定'test'时,您只需从logical强制转换为character。它仍然是原子矢量,而不是list

由于它是一个字符向量和原子,你不能给不同的元素赋予不同的属性,并且

attr(x[[1]], 'try') <- 'testing'

实际上没有分配任何东西(也许它应该发出警告,但事实并非如此)。

阅读vector

的帮助页面可以为您提供良好的服务