【问题标题】:Use S3 virtual class as slot of an S4 class, got error: got class "S4", should be or extend class "nls.lm"使用 S3 虚拟类作为 S4 类的插槽,出现错误:得到类“S4”,应该是或扩展类“nls.lm”
【发布时间】:2012-11-30 06:05:48
【问题描述】:

R 版本:

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

我想做一个S4类,使用nls.lm(包:minpack.lm)函数的输出对象作为槽:

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"

似乎如果我想在新的一些插槽中进行初始化,这会导致 S3 类插槽出现问题?

关于如何避免这个问题的任何线索?

谢谢

【问题讨论】:

    标签: r s4 slots


    【解决方案1】:

    实际上,无参数构造函数也返回了一个无效对象,只是没有经过测试

    > 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")
        )
      )
    

    【讨论】:

    • 感谢您的快速回答。刚刚在我的“真实”代码中实现。对象现在有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2011-11-14
    • 2023-04-06
    • 1970-01-01
    相关资源
    最近更新 更多