定义S3类“bar”的对象和打印方法:
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无济于事。任何人都知道如何解决它?
我想要名字的原因是因为我定义的东西是一个函数,我希望能够在print方法中放入'try foo(2)'(从对象的名称中获取'foo') )。是的,您可以在S3中子类化函数。我想可能还有其他的pifall ..
答案 0 :(得分:8)
这是一个相当特殊的情况,因为当您在命令行输入名称时,在调用foo
之前,R会将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,没有作为属性的名称(如Aaron所示),地球上没有办法从任何地方提取对象的名称。它只是在callstack中没有。
答案 1 :(得分:5)
如果您不打算重命名该对象,可以将该名称作为属性包含在内并打印出来。
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