2

クラス内のスロットの 1 つを任意のクラスにできるようにする方法はありますか?

つまり、次のようなもの

setClass("myClass", 表現(A="any"))

「S4」を試しましたが、うまくいきません

4

3 に答える 3

1

PaulGilbertのTSdbiパッケージのソースコードで素晴らしい回避策を見つけました。

setClassUnion("OptionalChar",   c("character",   "logical"))
setClass("myClass", representation(A="OptionalChar"))

characterこれは、期待しているが許可したい場合にも役立ちますNA。私はこれが「ANY」ではないことを知っていますが、おそらくあなたはそれを制限したいかもしれませんが、単一のモードにではありません。

于 2012-11-29T14:03:22.297 に答える
1

一般的な S4 関数を作成する場合は、メソッド引数の許容可能な署名を「ANY」に設定できるはずです。表現についての考え方はそれよりも具体的であるため、表現を「ANY」に設定できるかどうかはわかりません。署名が割り当てられていない引数は、「ANY」クラスで記録されます。リストまたはアトミックオブジェクトを受け入れることができる表現として「ベクター」タイプを使用できます。

setClass("myClass", representation(A="vector"))
[1] "myClass"
> new("myClass", A=list(a=c(2,3,4), b="a")  )
An object of class "myClass"
Slot "A":
$a
[1] 2 3 4

$b
[1] "a"

これがあなたが要求したほど一般的かどうかはわかりませんが、属性の必要性についても何も言いませんでした. ベクトルは属性を失うかもしれないと思っていましたが、そうではないようです:

> setClass("myClass", representation(A="vector"))
[1] "myClass"
> new("myClass", A=B  )
An object of class "myClass"
Slot "A":
$a
[1] 2 3 4

$b
[1] "a"

attr(,"myattr")
[1] "test"
于 2012-06-21T19:59:36.463 に答える
1

"ANY" を使用できます。

> setClass("myClass", representation(A="ANY"))
> new("myClass", A=c(1,2,3))
An object of class "myClass"
Slot "A":
[1] 1 2 3
> new("myClass", A=unique)
An object of class "myClass"
Slot "A":
function (x, incomparables = FALSE, ...) 
UseMethod("unique")
<bytecode: 0x00000000071a8270>
<environment: namespace:base>
于 2013-01-28T14:03:03.243 に答える