我是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)
由于命名空间冲突,我已经多次看到此消息。
这是一个 MRE:hash和data.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)