Скрытые объекты в списке - PullRequest
0 голосов
/ 01 декабря 2018

Я создаю пользовательский объект для пакета и хочу иметь список из двух объектов, но чтобы один из этих элементов был «скрыт»

Например:

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

, что, я думаю, невозможно при использовании специального метода печати.

У меня нет особых требований к доступу к другому элементу, но, думаю, что-то «дружественное».

Есть ли другой класс, который я должен использовать или создать новый класс?Любой совет будет принят во внимание.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я думаю, что для вас будет чище использовать атрибуты:

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
# 
0 голосов
/ 01 декабря 2018

Вы действительно можете определить собственный класс для вашего объекта.Позвольте

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...