我有一个继承自data.frame的S4类:
> setClass("Foo", contains="data.frame")
> x <- new("Foo", data.frame(a=1:2))
现在dplyr::filter
有效,但会发出警告:
> x %>% dplyr::filter(a > 1)
a
1 2
Warning message:
In class(x) <- c("tbl_df", "tbl", "data.frame") :
Setting class(x) to multiple strings ("tbl_df", "tbl", ...); result
will no longer be an S4 object
有什么好方法可以摆脱这种警告吗?我可以创造一个新的
filter
的泛型,并将dplyr版本包装在这个东西中
像
dplyr::filter(as.data.frame(unclass(x)), ...)
但是,为了避免这样的额外工作,这不是继承的重点吗?
此警告是否与dplyr无法识别S4对象有关?
编辑:dplyr 0.4.3和0.5.0的相同行为
答案 0 :(得分:2)
dplyr
使用tibble包,其中从data.frame转换为tibble,为参数分配三个类。在此之前调用unclass()
,但是未分类的不将其状态的对象剥离为S4对象,因此发生上述警告。
简而言之,这是dplyr
中的问题。我认为你必须为仿制药制作包装纸。