这意味着什么:无法为签名'" B"'找到函数'A'的继承方法

时间:2016-04-29 16:20:34

标签: r

我是R的新手,并通过以下消息不断收到错误:

  

无法为签名'" B"'

找到函数'A'的继承方法

在大多数情况下,我已经能够通过在线查找替代示例来解决我的问题,但我想了解错误消息的含义,以便更好地了解R的工作原理。

例如,此代码:

library("RSQLite")
con = dbConnect(drv="SQLite", dbname="database.db")

生成此警告:

  

无法为签名'"字符"'找到函数'dbConnect'的继承方法''

修复该错误后,此代码:

dbClearResult(p1)

产生此警告:

  

无法为签名'" data.frame"'

找到函数'dbClearResult'的继承方法

有人可以解释这类错误信息试图告诉我的内容吗?

具体而言,术语" interhited","方法","功能"和"签名"所有这些似乎与我从其他语言理解的概念有关,但这个错误的句子结构意味着它们在R中的含义略有不同。

2 个答案:

答案 0 :(得分:19)

这是尝试将S4泛型函数应用于类的对象时将获得的消息类型,该类没有定义的S4方法(或者至少已附加到当前R会话)。

这是一个使用栅格包(用于空间栅格数据)的示例,它充满了S4函数。

library(raster)

## raster::rotate() is an S4 function with just one method, for "Raster" class objects
isS4(rotate)
# [1] TRUE
showMethods(rotate)
# Function: rotate (package raster)
# x="Raster"

## Lets see what happens when we pass it an object that's *not* of class "Raster"
x <- 1:10
class(x)
# [1] "integer"
rotate(x)
# Error in (function (classes, fdef, mtable)  : 
#   unable to find an inherited method for function ‘rotate’ for signature ‘"integer"’

答案 1 :(得分:2)

由于命名空间冲突,我已经多次看到此消息。

这里是MRE:hashdata.table库都具有copy函数。

在新的R会话中:

> library(data.table)
> library(hash)

导致copy中的data.table被屏蔽:

> DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
> copy(DT)
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘copy’ for signature ‘"data.table"’

解决方案是指定名称空间

> data.table::copy(DT)
   x y v
1: b 1 1
2: b 3 2
3: b 6 3
4: a 1 4
5: a 3 5
6: a 6 6
7: c 1 7
8: c 3 8
9: c 6 9