列表中的隐藏对象

时间:2018-11-30 22:08:29

标签: r package

我正在为一个包装创建一个自定义对象,我希望有两个对象的列表,但是其中一个元素被“隐藏”了

例如:

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友好”的。

我应该使用其他类别还是创建一个新类别?任何意见,将不胜感激。

2 个答案:

答案 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
#