【发布时间】:2021-12-26 13:24:46
【问题描述】:
我在 R 中有一个涉及 S4 类系统的晦涩问题。
首先我创建一个 tibble 并保存它:
df = tibble::tibble(a=1:5, b=2:6)
save(df, file="foo.Rdata")
接下来,我关闭 R 会话,并开始一个新会话(出于某种原因,这很重要)。
然后,我定义了一个在data.frame(tibble 是其子类)上调度的 S4 方法:
setGeneric("sumTheColumns", function(target){
standardGeneric("sumTheColumns")
})
setMethod("sumTheColumns", signature(target="data.frame"), function(target){
colSums(target)
})
load("foo.Rdata")
print(df)
print(class(df))
print(showMethods(sumTheColumns))
sumTheColumns(df)
由此,R 输出:
[1] "sumTheColumns"
a b
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
[1] "tbl_df" "tbl" "data.frame"
Function: sumTheColumns (package .GlobalEnv)
target="data.frame"
Error in (function (classes, fdef, mtable) :
unable to find an inherited method for function ‘sumTheColumns’ for signature ‘"tbl_df"’
Calls: sumTheColumns -> <Anonymous>
Execution halted
如您所见,tibble 正在正确保存和加载,并且它保留了它的类,但是它不再正确分派。有趣的是,如果您在我们创建df 的第一个 R 会话中定义并调用这些相同的方法,这些方法会正确分派。
为什么会发生这种情况,我该如何解决?
如果这是一个特定于操作系统的错误,这里是来自sessionInfo 的一些输出:
> sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-conda-linux-gnu (64-bit)
Running under: Ubuntu 21.04
【问题讨论】: