Я пытаюсь понять поведение наследования класса 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
просто изменяет часть моего объекта, оставляя остальные слоты неизменными, что может быть полезным для использования свойством.
Затем давайте сделаем что-то менее очевидным, пусть два объекта myClass в "row_bind":
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
) делает потерю слота?и как это работает?