2

我收到消息

parent.frame() 中的错误:节点堆栈溢出 总结期间的错误:节点堆栈溢出

当我尝试使用 S4 命令“as”构造对象时,但当超类被声明为“VIRTUAL”时。

类层次结构如下:

PivotBasic 包含 Pivot 包含模型

Pivot 和 Pivot Basic 的 setClass 命令以及 PivotBasic 的构造函数如下所示。类 Pivot 没有构造函数。Model 构造函数太大,无法在此处插入。

这真的没什么大不了的(我认为),因为如果从 setClass 的表示参数中删除“VIRTUAL”关键字,一切都会正常工作。但我很好奇问题的原因。有人对此有见解吗?

谢谢,

费尔南多·萨尔达尼亚

setClass(Class = "Pivot", 
  representation = representation(
    pivotName = "character",
    pivotNames = "character",
    pivotData = "data.frame",
    "VIRTUAL"
  ),
  contains = "Model"
)

setClass(Class = "PivotBasic", 
  representation = representation(),
  contains = "Pivot"
)

pivotBasic <- function(
  portfolio,
  assets,

  controlVariableList,

  pivotData = NULL, # pivotName is ignored if pivotData is not null
  pivotName = "N_WEEKDAY_3_6",

  firstPredictionDate = as.Date(integer(), origin = "1970-01-01"),
  name = NULL,
  tags = "Event"
) {
  if (missing(portfolio)) stop("[PivotBasic: pivotBasic] - Missing portfolio argument")
  if (missing(assets)) stop("[PivotBasic: pivotBasic] - Missing assets argument")
  if (missing(controlVariableList)) stop("[PivotBasic: pivotBasic] - Missing controlVariableList argument")

  object <- model(
    portfolio,
    assets,
    controlVariableList,
    firstPredictionDate,
    name,
    tags)

  # The error message happens when this command is executed
  mdl <- as(object, "PivotBasic") 

  # Other code

  mdl
} # end pivotBasic
4

1 回答 1

1

这是说明您的问题的最小示例吗

.Model <- setClass(Class = "Model",
  representation=representation(x="integer")
)

setClass(Class = "Pivot", 
  representation = representation("VIRTUAL"),
  contains = "Model"
)

.PivotBasic <- setClass(Class = "PivotBasic",
  contains = "Pivot"
)

这会产生错误

>     as(.Model(), "PivotBasic")
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
> R.version.string
[1] "R version 3.0.0 Patched (2013-04-15 r62590)"

但可能会产生一个错误,就像您在早期版本的 R 中看到的那样。R-devel 邮件列表上的这个线程是相关的,解决方案是定义一个setIs方法,例如

setIs("PivotBasic", "Model", 
  coerce = function(from) .PivotBasic(x = from@x), 
  replace = function(from, value) {
      from@x = value@x
      from
  }
)

我认为是setIs类定义的一部分。如果有许多插槽需要复制,那么在替换功能中可能需要进一步的解决方法,

nms <- intersect(slotNames(value), slotNames(from))
for (nm in nms)
    slot(from, nm) <- slot(value, nm)
from

但根本问题实际上在于 S4 的实现。删除“VIRTUAL”规范的代价是它会损害您的类设计,并且大概是 S4 系统的形式主义首先促使您做出选择;面对替代方案时,也许这并不是一个糟糕的成本。

于 2013-05-04T16:24:05.440 回答