在一個群里看到這樣一條報錯化戳,截圖如下:
當然這種問題解決起來也很快,無非就是把報錯信息復制出來放在搜索引擎上罗侯,只不過你要挑選合適的搜索引擎完残。
解決方案就是用dplyr::select
。
雖然報錯解決了姚垃,但是我還想著要重復出這個報錯念链。因為只有能重復出報錯,才能證明你不是運氣好才解決积糯。(就和Windows上出錯靠重啟掂墓,不行就重裝,再不行換電腦一樣)看成。
在他提供的代碼中君编,我判斷可能是下面兩行代碼導致的報錯,因為這兩個代碼都有一個select
函數(shù)川慌,或許是R無法正確的處理應該使用哪個select
.
library(AnnotationHub)
library(dplyr)
于是我找了一個最簡單的例子來證明我的想法
library(AnnotationHub)
library(dplyr)
data("mtcars")
select(mtcars, mpg)
錯誤并沒有出現(xiàn)吃嘿。R并沒有我想象的那么弱,泛型函數(shù)能夠正確的根據(jù)對象選擇合適的函數(shù)梦重。
正當我一籌莫展時兑燥,突然想到,會不會是因為操作者只加載了AnnotationHub
而跳過了dplyr
包加載了呢琴拧?如此降瞳,select
函數(shù)在命令空間中存在,但卻沒有適合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"'
結(jié)果驗證了我的推測。
這也是初學者最常見的錯誤沛膳,忘記加載R包扔枫,或者甚至根本就沒有裝上這個R包。
當然還有一種可能锹安,就是另外的R包在加載的時候?qū)⒁延械暮瘮?shù)進行了屏蔽短荐,例如MASS
但是報錯信息不一樣倚舀,他會說函數(shù)有未使用的參數(shù)。
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"’
如果你只是調(diào)用R包瞄桨,那么這種報錯可以除了用dplyr::select
形式,還可以用detach
函數(shù)進行解決
detach("package:MASS", unload = TRUE)
detach("package:AnnotationDbi", unload = TRUE)
select(mtcars, mpg)
但是如果你準備寫R包或者封裝一些R腳本讶踪,那么你要特別注意這些大家特別喜歡的函數(shù)名芯侥,最好就是用packages::function
的方式進行函數(shù)調(diào)用,雖然代碼長了些乳讥,但是能提高穩(wěn)定性柱查。
hoptop -- 可能是中國在現(xiàn)場處理過R語言報錯最多的人