2

VenablesとRipleyによって書かれた本「StatisticsandComputing」には、一般的なグループ関数Mathのクラス「polynomial」のオブジェクトでメソッド関数を定義する例があります。数学は、abs、acos、acoshなどのいくつかのコンポーネント関数を含むグループ関数です...

以下は、グループジェネリック関数Mathのメソッド関数を定義するために本で言及されているコードです(コードはS4クラス(新しいスタイルのR / Sクラス)用であることに注意してください)。

setMethod("Math", "polynomial", 
           function(x) {
            switch(.Generic, ceiling = , floor = , 
            trunc = polynomial(callGeneric(x@coef), rat = x@rat),
            stop(paste(.Generic, "not allowed on polynomials"))
            )}
         )

setMethod()を使用して、クラス "polynomial"のオブジェクトで呼び出されたときに、ジェネリック関数Mathのメソッド関数を定義していることを理解しています。ここでどのスイッチが機能するか説明していただけますか?スイッチのRヘルプを読みましたが、それでも以下の部分を理解するのに苦労しています。

 switch(.Generic, ceiling = , floor = , 
            trunc = polynomial(callGeneric(x@coef), rat = x@rat),
            stop(paste(.Generic, "not allowed on polynomials"))
            )}

上記の多項式関数は、クラス「polynomial」のオブジェクトを作成するためのコンストラクター関数であることに注意してください。

4

2 に答える 2

3

コードを試してみるのは有益だと思います(私が広めようとしているこの理解は、純粋に私が今観察したものからのものです。このようにスイッチを使用できることすら知りませんでした):

関数の外部で実行するようにコードを調整しました。

test <- "ceiling"
test <- "floor"
test <- "trunc"

switch(test, 
    ceiling = , 
    floor = , 
    trunc = mean(1:10),
    stop(paste(test, "not allowed on polynomials"))
)

テストの各条件を試してみると、天井、床、またはトランクの場合、どのトランクが返されるかがわかります=。床に何かを入れる場合:

test <- "floor"

switch(test, 
    ceiling = , 
    floor = 5, 
    trunc = mean(1:10),
    stop(paste(test, "not allowed on polynomials"))
)

別の応答が返されます。

私は間違っているかもしれませんが、これは書かれている可能性があると思います:

if (.Generic %in% c(ceiling, "floor", "trunc"){
    polynomial(callGeneric(x@coef), rat = x@rat)
} else {
    stop(paste(.Generic, "not allowed on polynomials"))
}

この解釈は正しいが、この特定のコンテキストに精通していない場合は興味があります。

于 2012-08-06T15:49:49.847 に答える
1

.Generic現在の関数を呼び出すために使用される名前を識別します。これは次のように考えることができます。関数が、、またはとして呼び出された場合はceilingfloor指定truncされた実装polynomial(callGeneric(x@coef), rat = x@rat)が呼び出されます。それ以外の場合は、エラーが出力されます。との後にある空の引数は、フォールスルーを意味=します。実際にコードを含む次の引数が実行されます。ceilingfloor

于 2012-08-06T15:52:00.063 に答える