网络包更改了字符向量的摘要行为,打破了summary.data.frame(打印所有值,前面是NULL :)

时间:2017-06-09 20:35:41

标签: r statnet

加载network包后,我遇到了summary.data.frame函数的问题:如果存在类"character"的列,而不是通常的输出,则摘要将打印值来自所有行,由NULL:开头。这是一个玩具示例:

test <- data.frame(a=c("some", "char", "vector", "with", 
                       "many", "many", "words"),
                   b=1:7, stringsAsFactors = FALSE)

# Expected behaviour

summary(test$a)

##    Length     Class      Mode 
##         7 character character

summary(test)

##       a                   b      
##  Length:7           Min.   :1.0  
##  Class :character   1st Qu.:2.5  
##  Mode  :character   Median :4.0  
##                     Mean   :4.0  
##                     3rd Qu.:5.5  
##                     Max.   :7.0

library("network")

## network: Classes for Relational Data
## Version 1.13.0 created on 2015-08-31.
## ...

# Behavior after loading network:

summary(test$a)

##   char   many   some vector   with  words 
##      1      2      1      1      1      1

summary(test)

##     a                b      
##  NULL:some     Min.   :1.0  
##  NULL:char     1st Qu.:2.5  
##  NULL:vector   Median :4.0  
##  NULL:with     Mean   :4.0  
##  NULL:many     3rd Qu.:5.5  
##  NULL:many     Max.   :7.0  
##  NULL:words

请注意,输出包括字符向量的所有元素,包括重复,因此您可以获得1000行的1000行摘要, 这使得摘要功能无法使用。 在分离网络包之后,此行为仍然存在,直到重新启动新的R会话。

出现问题:通常UseMethod("summary")用于字符向量调用summary.default,它产生正常输出,其中names

summary.default(test$a)

##    Length     Class      Mode 
##         7 character character

names(summary.default(test$a))

## [1] "Length" "Class"  "Mode"

网络包定义了一个summary.character函数,它只是将一个"summary.character"类添加到角色对象中,使其打印调用network::print.summary.character,生成最多{{{1}的表。 1}}最常见的值。对象本身未更改,因此10names

NULL

麻烦来自summary.character ## function (object, ...) ## { ## class(object) <- c("summary.character", class(object)) ## object ## } ## <environment: namespace:network> summary.character(test$a) ## char many some vector with words ## 1 2 1 1 1 1 names(summary.character(test$a)) ## NULL class(summary.character(test$a)) ## [1] "summary.character" "character" length(summary.character(test$a)) ## [1] 7 as.character(summary.character(test$a)) ## [1] "some" "char" "vector" "with" "many" "many" "words" 中的这三行:

summary.data.frame

它位于列 sms <- format(sms, digits = digits) lbs <- format(names(sms)) sms <- paste0(lbs, ":", sms, " ") 循环内,其中for是当前列的sms输出。对于summary的输出,summary.character实际上是整列,smsnames(sms),因此问题。

问题的核心原因是NULL返回原始对象,而不是其委托给summary.character的摘要表示。 print.summary.character只是将其与其他摘要粘贴在一起,转储整列。

如果不考虑summary.data.frame的来源,如何解决这个问题的任何想法都将非常感激。

1 个答案:

答案 0 :(得分:0)

我找到了一个转机,遗​​憾的是它通过定义一个函数format.summary.character来修复R {名称空间中的R'命名空间,以恢复{{1}内代码的预期行为}。该功能的灵感来自summary.data.frame

format.factor

定义此函数后,字符向量的摘要输出仍由format.summary.character <- function(x, ...) { s <- summary.default(as.character(x), ...) format(structure(as.character(s), names = names(s), dim = dim(s), dimnames = dimnames(s)), ...) } 控制,但summary.character的输出恢复正常。

summary.data.frame