如何创建一种不需要';在R中打印属性(不复制对象)?

如何创建一种不需要';在R中打印属性(不复制对象)?,r,methods,printing,copy,R,Methods,Printing,Copy,我正在R中创建一个自定义S3对象,但是当我打印它时,属性也会被打印出来。例如: x属性(,“类”) #>[1]“myclass” 很公平,我还没有添加print方法。SO和其他地方的许多答案都建议删除对象的属性,然后像这样打印它(还以不可见的方式返回对象以保持print原始属性): x[1]123 #>属性(,“类”) #>[1]“myclass” 哈德利在他的高级R书中建议,可以使用NextMethod()来实现。我花了一些时间思考如何在打印带有属性的S3对象时防止创建副本,但我不知道如何

我正在R中创建一个自定义S3对象,但是当我打印它时,属性也会被打印出来。例如:

x属性(,“类”)
#>[1]“myclass”
很公平,我还没有添加
print
方法。SO和其他地方的许多答案都建议删除对象的属性,然后像这样打印它(还以不可见的方式返回对象以保持
print
原始属性):

x[1]123
#>属性(,“类”)
#>[1]“myclass”
哈德利在他的高级R书中建议,可以使用
NextMethod()
来实现。我花了一些时间思考如何在打印带有属性的S3对象时防止创建副本,但我不知道如何做到这一点

事实上,我刚刚测试了打印一个
tibble
,还创建了一个副本:

z[1]“”
打印(z)
#>tracemem[0x55e2aa368c48->0x55e2aa339e48]:lapply tbl_子集_行[.tbl_df[do.call head.data.frame head as.data.frame tbl_format_setup.tbl_format_setup_格式_setup格式.tbl format writeLines print.tbl
#>#A tible:1 x 2
#>xy
#>    
#> 1     1     2
但是
数据表
不:

z[1]“”
打印(z)
#>xy
#> 1: 1 2
所以我想这个问题是可以解决的,但我还没有弄明白怎么

编辑:

好的,我读了一些关于
print.data.frame
,它通过将
data.frame
转换成
矩阵,然后打印这个矩阵来解决这个问题。这是一个非常聪明的解决方案,我猜
data.table
使用了类似的方法

但是,更一般地说,这不适用于其他类型的对象(例如,无法格式化为矩阵的对象)。以这一种为例:

z$a
#>a b
#> 1 1 2
#> 
#>b美元
#>c d
#> 1 3 4
#> 
#>属性(,“类”)
#>[1]“myotherclass”
print.myotherclass TraceM[0x56298a95fd48->0x56298aaa58a8]:print print.myotherclass print
#>一美元
#>a b
#> 1 1 2
#> 
#>b美元
#>c d
#> 1 3 4

在这种情况下您是如何做到的?

在您的打印方法中使用类似于
打印(x[seq\u-along(x)])
的东西怎么样?它避免了看起来的复制,并且属性保持不变

z <- list(a = data.frame(a = 1, b = 2), b = data.frame(c = 3, d = 4))
z <- structure(z, class = "myotherclass")
tracemem(z)

print.myotherclass <- function(x, ...) {
  print(x[seq_along(x)])
  return(invisible(x))
}

y <- print(z)
#> $`a`
#> a b
#> 1 1 2
#> 
#> $b
#> c d
#> 1 3 4

attributes(y)
#> $`names`
#> [1] "a" "b"
#> 
#> $class
#> [1] "myotherclass"
z
#>b美元
#>c d
#> 1 3 4
属性(y)
#>$`名称`
#>[1]“a”“b”
#> 
#>美元级
#>[1]“myotherclass”

就是这样!我曾想过类似的事情,但您的答案要优雅得多。我想知道是否可以有条件地只隐藏几个属性,而不是所有属性,但您确实回答了我最初提出的问题!我想您可以在函数中添加第二个print语句,以仅显示属性的子集ttributes,类似于
print(attr(x,'class'))
。尽管这并不是任何条件。