加载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}}最常见的值。对象本身未更改,因此10
为names
。
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
实际上是整列,sms
是names(sms)
,因此问题。
问题的核心原因是NULL
返回原始对象,而不是其委托给summary.character
的摘要表示。 print.summary.character
只是将其与其他摘要粘贴在一起,转储整列。
如果不考虑summary.data.frame
的来源,如何解决这个问题的任何想法都将非常感激。
答案 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