【发布时间】:2019-04-09 08:40:24
【问题描述】:
我试图理解继承 tibble 类的行为并面临以下情况。我创建了一个类myClass,我为它定义了一个打印函数:
library(dplyr)
library(tibble)
myClass<-function(x,y,var){
new_tibble(data.frame(x=x,y=y),oneVar=var,subclass='myClass')}
myObj=myClass(rnorm(10),rnorm(10),'s')
myObj2=myClass(rnorm(10),rnorm(10),'s2')
print.myClass<-function(x,...){
print(as_tibble(x))
print(slot(x,'oneVar'))
}
然后,让我们尝试使用一些 dplyr 函数来修改我的对象:
myObj %>% arrange(x) %>% filter(x>0)
# A tibble: 6 x 2
x y
<dbl> <dbl>
1 0.183 0.826
2 0.801 0.504
3 1.19 2.53
4 1.24 0.238
5 1.28 -0.0557
6 1.69 -0.734
[1] "s"
看起来调用 filter 和 arrange 只是修改了我的对象的 tibble 部分,而其他插槽保持不变,这可能是一个有用的属性可以利用。
然后让一些不太明显的东西,让“row_bind”成为两个 myClass 对象:
bind_rows(myObj,myObj2)
# A tibble: 20 x 2
x y
<dbl> <dbl>
1 0.801 0.504
2 1.19 2.53
3 -1.69 0.549
4 1.24 0.238
5 -0.109 -1.05
6 -0.117 1.29
7 0.183 0.826
8 1.28 -0.0557
9 -1.73 -0.784
10 1.69 -0.734
11 -0.216 -1.31
12 -0.335 -0.600
13 -1.09 -0.129
14 -0.0854 0.887
15 1.07 -0.151
16 -0.145 0.330
17 -1.17 -3.23
18 -0.819 -0.772
19 0.685 0.287
20 -0.320 -1.22
Error in slot(x, "oneVar") :
no slot of name "oneVar" for this object of class "myClass"
这里缺少“oneVar”插槽,因此“myClass”对象的完整性被破坏。我理解,这种行为不一定是问题,但请尝试了解它的来源。
然后是我的问题:
bind_rows 中涉及的哪些机制(例如filter 中未涉及)导致插槽丢失?
它是如何工作的?
【问题讨论】: