2012-10-31 58 views
4

我試圖創建從數據幀繼承一個新的類:R:一個S4對象上應用terms.formula繼承data.frame

> setClass('new.frame', 
    representation(colour='character'), 
    contains = 'data.frame') 

這是一個類,用於測試的實例:

> test_data = data.frame(cbind(runif(5), runif(5))) 
> names(test_data) = c('X', 'Y') 
> test_frame = new('new.frame', test_data, colour='red') 

只是爲了確保它看起來沒事......

> data.frame 
Object of class "new.frame" 
      X   Y 
1 0.8766306 0.4741213 
2 0.1221508 0.5117665 
3 0.4838761 0.4973627 
4 0.7858294 0.4064749 
5 0.5147703 0.9135304 
Slot "colour": 
[1] "red" 

...並確保繼承工作

> is.data.frame(test_frame) 
[1] TRUE 
> getClass(class(test_frame)) 
Class "new.frame" [in ".GlobalEnv"] 

Slots: 

Name:    .Data    colour    names 
Class:    list   character   character 

Name:   row.names   .S3Class 
Class: data.frameRowLabels   character 

Extends: 
Class "data.frame", directly 
Class "list", by class "data.frame", distance 2 
Class "oldClass", by class "data.frame", distance 2 
Class "vector", by class "data.frame", distance 3 

這是我遇到的,當我試圖利用的是一個數據幀屬性的問題:

> terms.formula(Y ~ X, data = test_frame) 
Error in terms.formula(Y ~ X, data = test_frame) : 
    'data' argument is of the wrong type 

我可能會錯過一些愚蠢的。如果是這樣,提前謝謝指出。

如果我對這裏的問題是正確的,是有反正我可以terms.formula認識到,我給它一個data.frame的事實呢?

回答

1

debug(terms.formula),然後運行terms.formula(Y ~ X, data = test_frame)說明你的代碼上線3和引用代碼塊4失敗:

if (!is.null(data) && !is.environment(data) && !is.data.frame(data)) 
    data <- as.data.frame(data, optional = TRUE) 
terms <- .Internal(terms.formula(x, specials, data, keep.order, 
    allowDotAsName)) 

的問題必須是調用.Internal(terms.formula())期望一個「老式」 data.frame ,並且不是被傳遞new.frame類的對象。 作爲一種變通方法,爲什麼不只是通過terms.formula()它期望對象的類型(縵data.frame)?

這裏有一個簡單的方法來做到這一點:

terms.formula(Y ~ X, data = unclass(test_frame)) 
# Y ~ X 
# attr(,"variables") 
# list(Y, X) 
# attr(,"factors") 
# X 
# Y 0 
# X 1 
# attr(,"term.labels") 
# [1] "X" 
# attr(,"order") 
# [1] 1 
# attr(,"intercept") 
# [1] 1 
# attr(,"response") 
# [1] 1 
# attr(,".Environment") 
# <environment: R_GlobalEnv> 
+0

我還沒敢勇敢跟蹤(或理解)的SP包是如何工作的,但SpatialPointsDataFrame(或SpatialxxxDataFrame)會很樂意與terms.formula – mnel

+2

工作@mnel - 這是因爲一個'SpatialPointsDataFrame'失敗'is.data.frame()'測試中所引用的代碼塊的第一線之上,引發了調用'as.data.frame()'(和,真,'as.data.frame.SpatialPointsDataFrame()')。返回一個誠實,善良data.frame,根據需要,所以'。內部通話(terms.formula())'工作得很好。 (如果你運行'庫(SP);例如(默茲); is.data.frame(默茲);類(as.data.frame(默茲))',你可以看到這是如何工作的。) –

+0

精彩。謝謝喬希!並討論這個問題! –