我试图找出我们在强制类型后得到的两种结构之间的区别。 str()的初始输出是首先共享的,第二个是使用属性进行强制类型输出后的输出。这两者有区别吗?我似乎无法在str()输出中找到它的行为方式的差异。当我们使用attributes()并说as.numeric()时,为什么str()的输出不同?
data_test <- iris
str(data_test)
#'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 #1 1 1 ...
cols <- names(data_test)
classes_cols <- c("numeric","numeric","numeric","numeric","factor")
for (i in (1:length(cols))){
attributes(obj = data_test[,(cols[i])])$class <- classes_cols[i]
}
str(data_test)
#'data.frame': 150 obs. of 5 variables:
# $ Sepal.Length:Class 'numeric' num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width :Class 'numeric' num [1:150] 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length:Class 'numeric' num [1:150] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width :Class 'numeric' num [1:150] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
答案 0 :(得分:1)
这里的区别在于一个人有一个属性,另一个人没有。属性&#34; class&#34;由str
特别处理,因为它可能引用S3类对象。
> x=runif(10)
> str(x)
num [1:10] 0.9621 0.4369 0.0911 0.2425 0.6501 ...
> attr(x,"class")="foo"
> str(x)
Class 'foo' num [1:10] 0.9621 0.4369 0.0911 0.2425 0.6501 ...
大多数情况下,R并不关心像这样的向量上的属性,但是日常和时间类的内容在数据框中整齐地打印出来。
向量不需要类属性来创建类:
> x = runif(10)
> class(x)
[1] "numeric"
> attr(x,"class")
NULL
因此,这里的打印差异完全取决于具有类属性的向量,当它不需要时。