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

use*_*234 18 r

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

无法为签名'"B"找到函数'A'的继承方法

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

例如,这段代码:

library("RSQLite")
con = dbConnect(drv="SQLite", dbname="database.db")
Run Code Online (Sandbox Code Playgroud)

生成此警告:

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

修复该错误后,此代码:

dbClearResult(p1)
Run Code Online (Sandbox Code Playgroud)

产生此警告:

无法为签名'"data.frame"找到函数'dbClearResult'的继承方法

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

具体来说,术语"interhited","method","function"和"signature"似乎都与我从其他语言理解的概念有关,但这个错误的句子结构意味着它们在R中的含义略有不同.

Jos*_*ien 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"’
Run Code Online (Sandbox Code Playgroud)


Jam*_*orn 7

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

这是一个 MRE:hashdata.table库都有copy函数。

在新R会话中:

> library(data.table)
> library(hash)
Run Code Online (Sandbox Code Playgroud)

导致copyfromdata.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"’
Run Code Online (Sandbox Code Playgroud)

解决方案是指定命名空间

> 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
Run Code Online (Sandbox Code Playgroud)