我正在尝试创建一个继承自数据框的新类: setClass('new.frame', representation(colour='character'), contains = 'data.frame') 这是该类的一个实例,用于测试: test_data = data.frame(cbind(runif(5), runif(5))) names
> 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()传递给它所期望的对象类型(一个简单的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>