R 获取S3打印方法的对象名称失败

R 获取S3打印方法的对象名称失败,r,r-s3,R,R S3,定义S3类“bar”的对象和打印方法: foo=list(1) class(foo) <- c("bar") print.bar <- function(x,...){ cat("print.bar says this was ",deparse(substitute(x)),"\n") } 很好,但自动打印失败: > foo print.bar says this was structure(list(1), class = "bar") 我猜这与行作为顶级表达式计

定义S3类“bar”的对象和打印方法:

foo=list(1)
class(foo) <- c("bar")
print.bar <- function(x,...){
  cat("print.bar says this was ",deparse(substitute(x)),"\n")
}
很好,但自动打印失败:

> foo
print.bar says this was  structure(list(1), class = "bar")
我猜这与行作为顶级表达式计算的方式有关。在R-devel上进行了快速搜索,但没有结果。有人知道怎么修吗


我想要这个名称的原因是因为我定义的东西是一个函数,我希望能够在print方法中输入'try foo(2)'(从对象的名称中获取'foo')。是的,您可以在S3中对函数进行子类化。我想可能还有其他Pifall..

如果不打算重命名对象,可以将名称作为属性包含并打印出来

foo <- structure(list(1), class="bar", name="foo")
print.bar <- function(x,...){
  cat("print.bar says this was",attr(x, "name"),"\n")
}
除非对同一对象使用不同的名称:

> fooX <- foo
> fooX
print.bar says this was foo 
>fooxfoox
print.bar说这是foo

这是一个相当特殊的情况,因为当您在命令行中键入名称时,在调用
print
之前,R用其值替换
foo
。这可以通过以下方式加以说明:

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)
foo=list(1)
类(foo)打印(foo)
[[1]]
打印(foo)
[[2]]
打印栏(foo)

因此,如果没有名称作为属性(如Aaron所示),那么在地球上,您将无法从任何地方提取对象的名称。它根本不在调用堆栈中。

是的,看起来无法完成。我可能会看一看源代码,看看这到底是怎么发生的。谢谢!
> fooX <- foo
> fooX
print.bar says this was foo 
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)