2

有没有人有使用参考类作为因素水平的经验?这是我在我的一个data.frame包中添加“类外键”支持的目标的一步。

我最终希望创建一个data.frame可以将与因子关联的代码作为整数存储的方法,但该因子的级别实际上是参考类对象,而不是通常使用的字符向量因子。我已经能够找到一些关于使用 S4 对象作为因子级别的信息,但这些技术似乎不适用于参考类。

例如,一个简单的:

> myClass <- setRefClass("MyClass", fields=list(a="numeric", b="character"))
> myObj <- myClass$new(a=1, b="test")
> factor(myObj)
Error in unique.default(x) : unique() applies only to vectors
> as.character(myObj)
Error in as.vector(x, "character") : 
  cannot coerce type 'environment' to vector of type 'character'
> as.character.MyClass <- function(x){ x$b }
> as.character(myObj)
[1] "test"
> factor(myObj)
Error in unique.default(x) : unique() applies only to vectors
>
> unique.MyClass <- function (x, incomparables = FALSE, ...) { unique(as.character(x)) }
> factor(myObj)
Error in as.vector(x, mode) : invalid 'mode' argument
> traceback()
2: as.vector(exclude, typeof(x))
1: factor(myObj)

似乎没有任何工作。看起来,在我最好的情况下,我可以到达factor()分析exclude参数的行:

exclude <- as.vector(exclude, typeof(x))

此时一切都崩溃了,因为我不允许创建“S4”类型的向量。

任何关于如何解决这个问题的想法,或者 - 甚至更好 - 以data.frame友好的方式将整数映射到引用类对象的替代方法将不胜感激!


编辑:针对@Aaron 的以下问题:

这里的简单解决方案是将整数存储在中data.frame,然后维护一个单独的列表/data.frame负责将这些 ID 映射到其他一些数据(例如引用类对象)。这将保留完成我需要的所有必要数据,但对我来说不太优雅,原因如下:

  1. 我正在设想一种解决方案,它允许我打印出引用类对象本身的某些部分,而不是 ID。例如,如果我将员工 ID(整数)映射到“员工”类,我希望data.frame打印员工的姓名,而不是他们的 ID。
  2. 我希望能够直接从data.frame. 以同样的方式,as.character(myDataFrame$someColumn)这会给我该列的标签(假设它是一个因素),而不是实际存储在data.frame.

同样,如果有更好的方法来解决这个问题,我非常愿意接受这个问题的替代解决方案!

4

1 回答 1

1

我认为这可以通过myFactor使用必要的方法创建一个新类来完成。format似乎是您在数据框中打印所需的;您可以轻松添加print或选择其他方法。我对 S3 方法最满意,所以这就是我在这里所做的。

在这里,我设置了您的参考类和该类的format功能myFactor

myClass <- setRefClass("MyClass", fields=list(a="numeric", b="character"))
format.myFactor <- function(obj, ...) {
  n <- sapply(levels(obj), function(x) x[["b"]])
  n[obj]
}

在这里,我制作了两个新的参考对象,并将它们用作我的新myFactor对象的关卡。

myObj <- myClass$new(a=1, b="test")
myObj2 <- myClass$new(a=4, b="testagain")
foo <- structure(c(2,1,2), levels=c(myObj, myObj2), class=c("myFactor","numeric"))
d <- data.frame(x=foo)

然后打印得很好。

> d
          x
1 testagain
2      test
3 testagain
于 2013-04-25T13:48:06.190 回答