我是R的新手,并通过以下消息不断收到错误:
无法为签名'" B"'
找到函数'A'的继承方法
在大多数情况下,我已经能够通过在线查找替代示例来解决我的问题,但我想了解错误消息的含义,以便更好地了解R的工作原理。
例如,此代码:
library("RSQLite")
con = dbConnect(drv="SQLite", dbname="database.db")
生成此警告:
无法为签名'"字符"'找到函数'dbConnect'的继承方法''
修复该错误后,此代码:
dbClearResult(p1)
产生此警告:
无法为签名'" data.frame"'
找到函数'dbClearResult'的继承方法
有人可以解释这类错误信息试图告诉我的内容吗?
具体而言,术语" interhited","方法","功能"和"签名"所有这些似乎与我从其他语言理解的概念有关,但这个错误的句子结构意味着它们在R中的含义略有不同。
答案 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:hash
和data.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