我很困惑为什么以下代码可以设置属性:
#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
。
答案 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