「Debug R」报错"unable to find an inherited method for function"是如何产生的

本文通过实例解析了R语言中因包加载顺序不当导致的函数冲突问题,并提供了使用`detach`函数及明确指定包内函数调用的方法来解决此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个群里看到这样一条报错,截图如下:

2013053-4668921737272f21.png
报错信息

当然这种问题解决起来也很快,无非就是把报错信息复制出来放在搜索引擎上,只不过你要挑选合适的搜索引擎。

2013053-fbbd9bacc06b1b7a.png
百度
2013053-f1d13cd9ddb82017.png
谷歌
2013053-8ba6356aad2fd382.png
必应

解决方案就是用dplyr::select

虽然报错解决了,但是我还想着要重复出这个报错。因为只有能重复出报错,才能证明你不是运气好才解决。(就和Windows上出错靠重启,不行就重装,再不行换电脑一样)。

在他提供的代码中,我判断可能是下面两行代码导致的报错,因为这两个代码都有一个select函数,或许是R无法正确的处理应该使用哪个select.

library(AnnotationHub)
library(dplyr)

于是我找了一个最简单的例子来证明我的想法

library(AnnotationHub)
library(dplyr)

data("mtcars")
select(mtcars, mpg)

错误并没有出现。R并没有我想象的那么弱,泛型函数能够正确的根据对象选择合适的函数。

正当我一筹莫展时,突然想到,会不会是因为操作者只加载了AnnotationHub而跳过了dplyr包加载了呢?如此,select函数在命令空间中存在,但却没有适合data.frame的版本,所以报错了呢?

library(AnnotationDbi)
data("mtcars")
select(mtcars, mpg)

# 报错信息如下
Error in (function (classes, fdef, mtable)  :
  unable to find an inherited method for function 'select' for signature '"data.frame"'

结果验证了我的推测。

这也是初学者最常见的错误,忘记加载R包,或者甚至根本就没有装上这个R包。

当然还有一种可能,就是另外的R包在加载的时候将已有的函数进行了屏蔽,例如MASS

2013053-0f742b2a0c9ab8bd.png
提示信息

但是报错信息不一样,他会说函数有未使用的参数。

library(dplyr)
library(MASS)
select(mtcars, mpg)
# 报错信息
Error in select(mtcars, mpg) : unused argument (mpg)

如果你在前面两个R包的基础上加载AnnotationHub时,报错又和之前一样

library(dplyr)
library(MASS)
library(AnnotationDbi)
select(mtcars, mpg)

Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function ‘select’ for signature ‘"data.frame"’

如果你只是调用R包,那么这种报错可以除了用dplyr::select形式,还可以用detach函数进行解决

detach("package:MASS", unload = TRUE)
detach("package:AnnotationDbi", unload = TRUE)
select(mtcars, mpg)

但是如果你准备写R包或者封装一些R脚本,那么你要特别注意这些大家特别喜欢的函数名,最好就是用packages::function的方式进行函数调用,虽然代码长了些,但是能提高稳定性。

hoptop -- 可能是中国在现场处理过R语言报错最多的人

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值