6

R バージョン:

    R version 2.15.2 (2012-10-26)
    Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

nls.lm (パッケージ: minpack.lm) の関数の出力オブジェクトをスロットとして使用する S4 クラスを作成したい:

setOldClass("nls.lm")

setClass (
  Class="TestClass",
  representation=representation(
      lmOutput = "nls.lm",
      anumeric = "numeric"
    )
  )

さて、このクラスを「コンストラクター関数」で呼び出したい場合は、次のようなことができます (正しいですか?):

myConstructor <- function()
{
  return(new("TestClass"))
}

pippo <- myConstructor()

pippo
An object of class "TestClass"
Slot "lmOutput":
<S4 Type Object>
attr(,".S3Class")
[1] "nls.lm"

Slot "anumeric":
numeric(0)

オブジェクト「pippo」は正しく初期化されているようです。

代わりにこのコードを使用すると、エラーが発生しました。

myConstructor2 <- function()
{
  pippo <- new("TestClass", anumeric=1000)
  return(pippo)
}

pippo <- myConstructor2()
Error in validObject(.Object) : 
 invalid class “TestClass” object: invalid object for slot "lmOutput" in class "TestClass": got class "S4", should be or extend class "nls.lm"

新しいいくつかのスロットで INIT を実行したい場合、これは S3 クラス スロットで問題を引き起こしますか?

この問題を回避する方法の手がかりはありますか?

ありがとう

4

1 に答える 1

3

実際、引数のないコンストラクターも無効なオブジェクトを返します。これはテストされていません。

> validObject(new("TestClass"))
Error in validObject(new("TestClass")) : 
  invalid class "TestClass" object: invalid object for slot "lmOutput"
  in class "TestClass": got class "S4", should be or extend class "nls.lm"

解決策は、適切なプロトタイプを提供することです。

setClass (
  Class="TestClass",
  representation=representation(
      lmOutput = "nls.lm",
      anumeric = "numeric"
    ),
  prototype=prototype(
      lmOutput=structure(list(), class="nls.lm")
    )
  )
于 2012-12-12T14:40:32.573 に答える