2014-04-01 30 views
2

重複的例子:S4類可能不包含「try-error」類對象?

setClass("test", representation(a="ANY")) 
A <- structure("blahblahblah", class="try-error") 
new("test", a=A) 
# Error in validObject(.Object) : invalid class 「test」 object: blahblahblah 

我想從validObject線29的問題源於:

sloti <- try(switch(namei, .S3Class = S3Class(object), 
    slot(object, namei)), silent = TRUE) 

這顯然會誘使slot(object, namei)返回如這裏的情況下,try-error類對象時,後面的任何內容。

無論如何,只是想在這裏問,如果這似乎是一個錯誤給任何人,然後我離開並提出tryCatch備用。

如果你很好奇,爲什麼在地球上我會做這樣的事情,我建立S4類存儲任意表達式求值,這在我的測試情況之一發生在包含的結果的結果try()聲明。

+1

部分解決方法可能是'x = new(「test」); x @ a = A'(插槽分配不觸發有效性檢查),但是,它看起來像一個錯誤。 –

回答

1

沒有,問題是下一行:

哈克解決方法是:

safeNew <- function(...) { 
    suppressMessages(trace(validObject, quote(inherits <- function(...) 
    if (eval.parent(substitute(namei != '.S3Class' && class(slot(object, namei)) == 'try-error'))) FALSE 
    else base::inherits(...)), at = 11)) 
    capture.output(res <- new(...)) 
    suppressMessages(untrace(validObject)) 
    res 
} 

setClass("test", representation(a="ANY")) 
A <- structure("blahblahblah", class="try-error") 
safeNew("test", a = A) # Now returns no error. 

編輯:我改變了一些代碼的上方,它現在的類型檢查正常,而不是禁用類型檢查。例如,

setClass("test", representation(a="ANY", b = "character")) 
A <- structure("blahblahblah", class="try-error") 
safeNew("test", a = A, b = 5) 
# Error in validObject(.Object) : 
# invalid class 「test」 object: invalid object for slot "b" in class "test": got class "numeric", should be or extend class "character" 
+0

我認爲它一方面是六...但我的觀點是錯誤的核心來源是使用'try'而不是'tryCatch'。此外,您的代碼現在是否會忽略該步驟中的所有錯誤?如果是這樣,我不確定這是否是正確的結果。 – BrodieG

+0

@BrodieG是的,但它現在已經修復。如果在該switch語句中存在錯誤,它現在將鍵入檢查其他所有內容,包括'try-error'。 –

+0

在上面的修改中查看我的評論。 –