0

Rでオブジェクトを動的に強制する方法はありますか?

背景 渡されたオブジェクトのクラスに基づいて特定のメソッドを返すことができる要約用の関数ファクトリを作成しようとしています。特に、これはhttp://adv-r.had.co.nz/Functional-programming.html#lists-of-functionsの質問の 1 つです。

base::summary() のように機能するサマリー関数を実装しますが、関数のリストを使用します。クロージャを返すように関数を変更し、関数ファクトリとして使用できるようにします。

たとえば、いくつかのバリエーションを試しましたが、それらはすべて正しくない/不完全です。

object.list = list(df = data.frame(),fr=factor(), mx = matrix())
summary.new = function(y){
  function(x,...){
    UseMethod(summary,x)
  }
}
summary.new.list = lapply(object.list, summary.new)

as.() のようなオブジェクトを動的に強制する方法があり、これを使用して汎用オブジェクトから適切なメソッドを返す方法があるかどうか疑問に思っています。

summary.new.list 関数

> summary.new.list
$df
function (x, ...) 
{
    UseMethod("summary", x)
}
<environment: 0x108b5edc>

$fr
function (x, ...) 
{
    UseMethod("summary", x)
}
<environment: 0x108b5de0>

$mx
function (x, ...) 
{
    UseMethod("summary", x)
}
<environment: 0x108b5ce4>

たとえば、オブジェクトに基づいて関数を呼び出したい。呼び出したいデータフレームの場合summary.new.list$df(data.frame(1:12,3,4))。$df 関数はまだ一般的であるため、現在は機能していますが、 UseMethod の代わりに、そこから基本的な summary.data.frame 関数を呼び出したいと思います

4

1 に答える 1

0

この例の意図された目的を正確には理解していませんが、ここで噛むべきことがあります。

 summary2 <- function(x){ switch( class(x)[1], "data.frame"= summary.data.frame, 
                                               "list"=summary.list , 
                                               "factor"=summary.factor,
                                               "matrix"=summary.matrix,
                                               "numeric" = summary.default) }
 summary.new.list = lapply(object.list, summary2)

 # Application of that list of functions matched to object classes
 > mapply( function(x,y) { do.call(x, list(y) )}, summary.new.list, object.list)
$df
< table of extent 0 x 0 >

$fr
integer(0)

$mx
    V1         
 Mode:logical  
 NA's:1   

基本的に、関数のクラスディスパッチを再発明しています。質問は「強制」を求めましたが、少なくとも私が読んだ限り、問題は強制を必要としないようでした。

于 2017-01-09T00:22:47.610 に答える