1

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

#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

4

1 回答 1

2

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

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

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

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

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

因此,当您分配时'test',您只是在强制 from logicalto character。它仍然是一个原子向量,而不是一个list

因为它是一个字符向量,并且是原子的,所以你不能给不同的元素不同的属性,并且

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

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

通过阅读帮助页面,您将得到很好的服务vector

于 2013-03-14T01:28:28.843 回答