组合的头部和尾部的方法中的R(combining head and tail methods in

2019-07-30 12:45发布

我使用中的R包的头部(d)和尾部(d)的方法utils的很多 - 频繁一前一后。 所以我写了两个功能一个简单的包装:

ht <- function(d, m=5, n=m){
  # print the head and tail together
  cat(" head -->  ", head(d,m), "\n", "--------", "\n", "tail -->  ", tail(d,n), "\n")
}

我得到一些意想不到的结果...有人可以帮我明白为什么? (这样我就可以修复它...或者至少了解您的解决方案!)。

一些背景...

数字是罚款:

x <- 1:100
ht(x)

由于是复杂的:

ni <- as.complex(1:100)
ht(ni)

和特点:

ll <- letters[1:26]
ht(ll)

基质失去它的结构,返回[1,1]到[5,5] + [16.1]至[20.5]但是作为两个向量 - 比较:

m <- matrix(1:10, 20)
ht(m)

至:

head(m, 5)
tail(m,5)

我想保持矩阵结构,为utils的方法做 - 这可能吗?

最后(当然,可能会有更多的错误,这只是在那里我到)data.frames是一个烂摊子:

df <- data.frame(num=x[1:26], char=ll)
ht(df)

这会产生以下错误:

head -->   Error in cat(list(...), file, sep, fill, labels, append) :   
  argument 2 (type 'list') cannot be handled by 'cat'

到此为止:

作为位完成后的utils的方法保持矩阵整齐,我试图修复下列编辑的问题:

function(d, m=5, n=m){
  # print the head and tail together
  rb <- rbind(head(d, m), tail(d,n))
  if (class(d) == 'matrix'){
    len <- nrow(rb)
    cat(" head -->  ", rb[(1:m),], "\n", "--------", "\n", "tail -->  ", rb[((len-n):len),], "\n")
  }
  else cat(" head -->  ", rb[1,], "\n", "--------", "\n", "tail -->  ", rb[2,], "\n")
}

这似乎并没有做过什么矩阵...并用相同的错误仍然打破了,当我

ht(df)

我从这些错误猜测,有一些问题与猫()在这里,但我无法弄清楚它是什么或如何解决它。

任何人都可以请帮助?

Answer 1:

为什么不修改你的函数输出一个列表,而不是?

ht <- function(d, m=5, n=m){
  # print the head and tail together
  list(HEAD = head(d,m), TAIL = tail(d,n))
}

下面是输出为您的matrixdata.frame

ht(matrix(1:10, 20))
# $HEAD
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4
# [5,]    5
# 
# $TAIL
#       [,1]
# [16,]    6
# [17,]    7
# [18,]    8
# [19,]    9
# [20,]   10

ht(data.frame(num=x[1:26], char=ll))
# $HEAD
#   num char
# 1   1    a
# 2   2    b
# 3   3    c
# 4   4    d
# 5   5    e
# 
# $TAIL
#    num char
# 22  22    v
# 23  23    w
# 24  24    x
# 25  25    y
# 26  26    z


Answer 2:

有人建议我把我的意见变成一个答案。

在你的[R控制台,当你键入head(m, 5)你看到印在屏幕上是真正的结果print(head(m, 5)) 因此,如果这是您希望输出的样子,考虑使用什么样print功能,而不是cat显示时, headtail的对象:

ht <- function(d, m=5, n=m) {
  # print the head and tail together
  cat("head -->\n")
  print(head(d,m))
  cat("--------\n")
  cat("tail -->\n")
  print(tail(d,n))
}

m <- matrix(1:10, 20)
ht(m)
# head -->
#      [,1]
# [1,]    1
# [2,]    2
# [3,]    3
# [4,]    4
# [5,]    5
# --------
# tail -->
#       [,1]
# [16,]    6
# [17,]    7
# [18,]    8
# [19,]    9
# [20,]   10

我觉得@ mrdwab的回答是一个非常优雅的解决方案。 它没有明确使用print ,而不是返回一个列表。 然而,当他的功能从R控制台调用,并且输出不被分配给任何东西,则它在打印到控制台(因此print被隐式地使用)。 我希望可以帮助您了解发生了什么事情。



文章来源: combining head and tail methods in R