R: последствия наследования тиббла - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь понять поведение наследования класса 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) делает потерю слота?и как это работает?

1 Ответ

0 голосов
/ 09 апреля 2019

Мне кажется, bind_rows не предназначен для хранения пользовательских слотов. С другой стороны, база R rbind сохраняет слот и использует слот из первого объекта следующим образом. Я также пытался data.table::rbindlist(list(myObj, myObj2)), но вывод больше не myClass. Именно так были созданы эти функции с различными требованиями и поведением.

rbind(myObj, myObj2)
# # A tibble: 20 x 2
#   x       y
#   <dbl>   <dbl>
# 1 -0.0978   0.629 
# 2  0.406   -0.889 
# 3  0.766   -0.746 
# 4 -0.715    0.872 
# 5  0.617    1.05  
# 6  0.353   -1.49  
# 7 -0.595   -1.41  
# 8 -3.20    -0.262 
# 9 -1.33     0.232 
# 10  0.835   -0.751 
# 11 -0.00793  0.807 
# 12  0.177    0.680 
# 13 -1.10     0.857 
# 14 -0.679    1.79  
# 15 -1.38     0.0481
# 16 -1.42     1.02  
# 17 -1.97     0.732 
# 18  1.72     1.06  
# 19 -0.773   -0.594 
# 20  0.490    0.186 
# [1] "s"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...