如何确定打印是否使用前缀

时间:2019-06-23 14:08:30

标签: r

我想知道print()函数的一个非常基本的行为,但我找不到解释。

如果我向向量添加name(),则不会获得前缀([1])。最小示例:

x <- 1
names(x) <- "name"
print(x)

y<-2
print(y)

输出:

print(x)
  

名称

     

1

print(y)
  

[1] 2

我想知道names()是否通过添加属性来更改类或类似内容。但是typeof()class()确实为x和y提供了相同的值。因此,我认为这是print()函数,当给定属性时,该函数不提供前缀作为输出。 print()何时使用前缀[x],何时不使用前缀?

1 个答案:

答案 0 :(得分:3)

在第一种情况下,对象x是数字矢量,没有属性。在第二个中-对象y也是数字矢量,但具有属性“名称”:

x <- 1
attributes(x)
# NULL

y <- 1
names(y) <- "value"
attributes(y)
# $`names`
# [1] "value"

在两种情况下,都使用print.default()方法显示对象的值。此函数调用.Internal(print.default(x, digits, quote, na.print, print.gap, right, max, useSource, noOpt))

查看此函数的源代码(例如,此处为https://github.com/wch/r-source/blob/trunk/src/main/print.c),我们可以看到,取决于矢量是否具有属性,输出是否包含每条输出行上第一个元素的索引:

if((dims = getAttrib(s, R_DimSymbol)) != R_NilValue && length(dims) > 1) {
   ...
}
else { // no dim()
...
   sprintf(ptag, "[[%d]]", i+1);
...
}