v <- c(a = 5, b = 6)
str(v)
# Named num [1:2] 5 6
# - attr(*, "names")= chr [1:2] "a" "b"
现在我们设置另一个属性:
attr(v, "color") <- "blue"
str(v)
# atomic [1:2] 5 6
# - attr(*, "color")= chr "blue"
为什么名称不再列在str
的输出中?
为什么atomic
?我同意v
是原子的,但我希望str
更精确,并指出v
是数字。
答案 0 :(得分:6)
您可以阅读utils:::str.default
以了解具体原因。我们不是使用两个版本的v
,而是比较两个向量:
v <- c(a = 5, b = 6)
u <- v; attr(u, "color") <- "blue"
有趣的是,is.vector(u)
会返回FALSE
,因此str
检查is.vector
时处理方式略有不同。这似乎并不重要,因为在这两种情况下,只有在它是唯一的属性时才会特别处理命名。例如,utils:::str.default
的第366-371行,属于else if(is.atomic(object))
,(原始if
处理if(is.vector(object) || ...)
,第241行)
if ((1 == length(a <- attributes(object))) && (names(a) ==
"names"))
str1 <- paste(" Named vector", le.str)
else {
str1 <- paste(" atomic", le.str)
}
稍后,仅当其他属性不在std.attr
(大概是#34;标准属性&#34;)时才打印,在向量的情况下包含名称。第499-507行(添加了我的评论):
if (give.attr) {
nam <- names(a) # a are the attributes, as seen above
for (i in seq_along(a)) if (all(nam[i] != std.attr)) {
# in the case of our vector, std.attr is "names", set on line 101
# in other cases, it might include "row.names", "class", "dim"
cat(indent.str, paste0("- attr(*, \"", nam[i], "\")="),
sep = "")
strSub(a[[i]], give.length = give.length, indent.str = paste(indent.str,
".."), nest.lev = nest.lev + 1)
}
}
此可能被视为错误。似乎,至少对于向量,名称被赋予特殊处理如果它们是唯一属性,但如果有其他属性则忽略names属性。 如果它是一个错误,我不清楚它的好处和风险是什么。
我希望
str
更精确,并指出v
是数字。
这似乎是str
作者的设计选择。我希望默认stringsAsFactors
为FALSE
。我不确定您是否想要回答问题的这一部分,当然还有其他功能可以了解对象,mode
,is
,typeof
, dput
,attributes
。查看约{500} str.default
行确实让我意识到函数的灵活性以及考虑了多少选项。
答案 1 :(得分:3)
我已经改进了R,即R aka&#34; R-devel&#34;的开发版本。 10分钟前,所以它会表现出+ - 如你所料,并且在这种情况下不再打印atomic
。
在R-devel邮件列表的相关主题中查看我的帖子: https://stat.ethz.ch/pipermail/r-devel/2017-November/075163.html