2013-05-04 58 views
2

我收到消息當超類是「VIRTUAL」時,爲什麼會收到消息「節點堆棧溢出」?

錯誤parent.frame():節點堆棧溢出 錯誤綜合報導期間:節點堆棧溢出

當我嘗試構建使用S4命令「作爲」的對象,但只有當超宣佈「虛擬」。

類層次結構如下所示:

PivotBasic包含樞軸包含型號

爲樞紐和樞紐基本的setClass命令和PivotBasic構造如下。類Pivot沒有構造函數。 Model構造函數太大而無法插入。

這實在不是什麼大不了的(我認爲),因爲如果「虛擬」的關鍵字從setClass的代表性說法去除一切工作正常。但我很好奇這個問題的原因。有人會對此有所洞察嗎?

感謝,

費爾南多·薩爾達尼亞

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 
+0

是什麼型號的功能做的,你爲什麼不使用'新(「PivotBasic」,...)'?如果您生成最小可重現的示例,則更有可能獲得幫助。 – hadley 2013-05-04 15:32:29

回答

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.的早期版本這thread on the R-devel mailing list是相關的,其中一個解決方案是定義一個setIs方法如

setIs("PivotBasic", "Model", 
    coerce = function(from) .PivotBasic(x = [email protected]), 
    replace = function(from, value) { 
     [email protected] = [email protected] 
     from 
    } 
) 

我認爲setIs作爲類定義的一部分,下看可能會產生一個錯誤。如果有很多需要插槽複製,再進一步變通可能是,在替換功能,

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

但根本的問題是真的在S4的實現。去除「虛」的說明書中的成本是它損害您一流的設計,想必該S4系統的形式主義是什麼促使你選擇擺在首位;也許這在面對替代品時並不是一個很糟糕的成本。

+0

謝謝。這很有幫助。但是,如果我的班級有很多插槽(情況如此),那麼我必須按照每個插槽的建議進行操作。另外,如果新插槽被添加或刪除,我必須修改對setIs的調用。沒有將超類聲明爲虛擬的有缺點嗎? – Soldalma 2013-05-05 14:42:12

+0

我用替換函數的更一般策略更新了答案。 – 2013-05-05 15:02:51