为什么str()不显示名称?

时间:2017-11-08 17:12:35

标签: r

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是数字。

2 个答案:

答案 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作者的设计选择。我希望默认stringsAsFactorsFALSE。我不确定您是否想要回答问题的这一部分,当然还有其他功能可以了解对象,modeistypeofdputattributes。查看约{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