我正在为一个包装创建一个自定义对象,我希望有两个对象的列表,但是其中一个元素被“隐藏”了
例如:
l = list(data = data.frame(a = 1:3, b = 4:6), hidden = list(obj1 = 1, obj2 = 2))
当我与列表进行交互时,我只希望与data
元素进行交互,而另一个仅可以专门访问。
因此,如果我输入l
> l
a b
1 1 4
2 2 5
3 3 6
我可以使用自定义打印方法进行管理。但我也希望能够做到
> l[,1]
[1] 1 2 3
我认为使用自定义打印方法是不可能的。
对于其他元素的访问方式,我没有任何具体要求,但是我想这是“ R友好”的。
我应该使用其他类别还是创建一个新类别?任何意见,将不胜感激。
答案 0 :(得分:4)
您确实可以为您的对象定义一个自定义类。让
class(l) <- "myclass"
然后,您可以为感兴趣的功能定义特定于自定义的方法。例如,对于l[, 1]
,我们有
`[.myclass` <- function(x, ...) `[`(x[[1]], ...)
接受这个双重列表,然后在第一个列表元素上调用通常的[
函数:
l[, 1]
# [1] 1 2 3
对于其他功能,例如print
,也可以这样做:
fun.myclass <- function(x, ...) fun(x[[1]], ...)
您仍然可以始终以通常的方式访问第二个对象,
l$hidden
# $obj1
# [1] 1
#
# $obj2
# [1] 2
答案 1 :(得分:1)
我认为使用属性会更清洁:
l <- list(data = data.frame(a = 1:3, b = 4:6),
hidden = list(obj1 = 1, obj2 = 2))
foo <- function(x){
attr(x$data,"hidden") <- x$hidden
x$data
}
l <- foo(l)
l
# a b
# 1 1 4
# 2 2 5
# 3 3 6
l[,1]
# [1] 1 2 3
attr(l,"hidden")
#
# [1] 1
#
#
# [1] 2
#