2

行列とdata.framesの両方で機能する関数の記述に関連するいくつかの質問があります。たとえば、想像してみてください。

DoubleThatThing <- function(thing) {
   stopifnot(is.matrix(thing) | is.data.frame(thing))
   2 * thing
}

私の質問は次のとおりです。

  1. マトリックスまたはdata.frameのいずれかであるオブジェクトの一般的な用語はありますか?Thingで置き換えるものDoubleThatThing

  2. 一般的に受け入れられている、または広く使用されている変数名はありthingますか?

  3. is.matrix(thing) | is.data.frame(thing)そのようなオブジェクトをテストするための最良の方法はありますか?

4

2 に答える 2

7

これがあなたを助けるかどうか、またはこれがあなたが望むものを与えるかどうかはわかりません。しかし、なぜとを宣言し、とのgeneric methodメソッドを定義しないのですか?ダミー/愚かな例を次に示します。matrixdata.frame

# generic method
my_fun <- function(x, ...) {
    UseMethod("my_fun", x)
}

# default action
my_fun.default <- function(x, ...) {
    cx <- class(x)
    stop(paste("No method defined for class", cx))
}

# method for object of class data.frame
my_fun.data.frame <- function(x, ...) {
    print("in data.frame")
    tapply(x[,1], x[,2], sum)
}

# method for object of class matrix
my_fun.matrix <- function(x, ...) {
    print("in matrix")
    my_fun(as.data.frame(x))
}

# dummy example
df <- data.frame(x=1:5, y=c(1,1,1,2,2))
mm <- as.matrix(df)

> my_fun(df)
# [1] "in data.frame"
# 1 2 
# 6 9 

> my_fun(mm)
# [1] "in matrix"
# [1] "in data.frame"
# 1 2 
# 6 9 

> my_fun(as.list(df))
# Error in my_fun.default(as.list(df)) : No method defined for class list
于 2013-03-21T21:24:24.840 に答える
4

Matrixとdata.frameは、実際にはまったく異なります。彼らに共通しているのは、2つの次元があるということです。したがって、その共通の属性をテストできます。

DoubleThatThing <- function(thing) {
   stopifnot(length(dim(thing)) == 2)
   2 * thing
}

しかし、なぜこれがより好ましいのかわかりませんis.matrix(thing) | is.data.frame(thing)

于 2013-03-21T20:41:38.857 に答える