4

私はRパッケージのhead(d)メソッドとtail(d)メソッドを頻繁に使用します-頻繁に次々に使用します。そこで、2つの関数の単純なラッパーを作成しました。

    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]に戻りますが、2つのベクトルとして-比較します。

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)

ここでcat()に問題があるとエラーから推測していますが、それが何であるか、またはそれを修正する方法がわかりません。

誰か助けてもらえますか?

4

3 に答える 3

8

代わりにリストを出力するように関数を変更してみませんか?

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

これがあなたmatrixとの出力ですdata.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
于 2012-07-22T12:51:11.317 に答える
5

コメントを答えに変えることが提案されました。

Rコンソールで入力するhead(m, 5)と、画面に表示されるのは実際にはの結果ですprint(head(m, 5))。したがって、これが出力の外観になりたい場合は、オブジェクトのandを表示するときprintではなく、関数を使用することを検討してください。catheadtail

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暗黙的に使用されます)。それが何が起こっているのかを理解するのに役立つことを願っています。

于 2012-07-22T14:36:22.503 に答える