Не удается получить имя объекта для метода печати S3 - PullRequest
13 голосов
/ 10 февраля 2011

Определите объект класса "S3" и метод печати:

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  cat("print.bar says this was ",deparse(substitute(x)),"\n")
}

Теперь print (foo) делает это:

> print(foo)
print.bar says this was  foo 

Отлично, но автопечать не удается:

> foo
print.bar says this was  structure(list(1), class = "bar")

Я предполагаю, что это как-то связано с тем, как линия оценивается как выражение верхнего уровня.Был быстрый поиск по R-devel безрезультатно.Кто-нибудь знает, как это исправить?

Причина, по которой я хочу имя, заключается в том, что я определяю функцию, и я хочу иметь возможность добавить 'try foo (2)' в метод print (получение 'foo' от имени объекта).Да, вы можете создавать подклассы функций в S3.Я полагаю, что могут быть другие пифалы ..

Ответы [ 2 ]

8 голосов
/ 11 февраля 2011

Это довольно частный случай, поскольку R заменяет foo на его значение перед вызовом print при вводе имени в командной строке. Это может быть проиллюстрировано:

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  print(sys.calls())
}

> foo
[[1]]
print(list(1))

[[2]]
print.bar(list(1))

> print(foo)
[[1]]
print(foo)

[[2]]
print.bar(foo)

ergo, без имени в качестве атрибута (как показал Аарон), на земле нет способа извлечь имя объекта из любого места. Его просто нет в стеке вызовов.

5 голосов
/ 10 февраля 2011

Если вы не собираетесь переименовывать объект, вы можете включить имя в качестве атрибута и напечатать его вместо этого.

foo <- structure(list(1), class="bar", name="foo")
print.bar <- function(x,...){
  cat("print.bar says this was",attr(x, "name"),"\n")
}

Тогда он сделает то, что вы ожидаете:

> print(foo)
print.bar says this was foo 
> foo
print.bar says this was foo 

Если вы не используете другое имя для того же объекта:

> fooX <- foo
> fooX
print.bar says this was foo 
...