簡體   English   中英

R:在繼承data.frame的S4對象上應用terms.formula

[英]R: Applying terms.formula on an S4 object inheriting 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

我可能錯過了一些愚蠢的事情。 如果是這樣,請提前感謝指出。

如果我對這里的問題是正確的,那么我是否可以制作term.formula認識到我給它一個data.frame的事實?

執行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()傳遞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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM