首頁 > 軟體

R語言初學者的一些常見報錯指南

2022-08-23 14:00:47

前言

與Python、C語言等相比,R語言可以說是比較容易的程式語言之一(更適合資料探索和科研)。儘管R語言相對簡單,但仍給新手小白們帶來無數的困難和痛苦。特別是,當你在run一份code,發現每行code都出現Error,更是無奈。然而,在剛開始學習R語言的過程中,這些ERROR又不可避免。對我自己而言,剛開始學習R時,也遇到了各式各樣的Error,確實讓人崩潰。這裡,我給大家總結了一些初學者學習程式碼時容易踩的坑,以及如何copy with,以Rstudio為例。

第一類:工作路徑問題

未設定工作路徑

如下:Cannot find XX.csx/txt/xlsx等等,這是新手常見的報錯–工作路徑問題。在出現這類報錯時,第一反應檢查自己在匯入/讀取檔案前是否設定了工作路徑,或者說工作路徑設定是否正確。具體理解:也就是說,所要讀取或載入的檔案必須存在當前設定的路徑下才允許。其次,如果我們設定了工作路徑,但是發現該存在路徑下,並沒有存放所需檔案也需要更改工作路徑。例子,有兩種情況需要注意。一是,在讀取檔案前沒有設定工作路徑,解決辦法:補充該工作路徑所在路徑,用setwd()設定;二是,設定了工作路徑,但是當前工作路徑不是該檔案所在的工作路徑,解決辦法:更改工作路徑,先用getwd()檢查當前的工作路徑,再用setwd()進行修改。

## 第一種情況
library(openxlsx)
mydata <- read.xlsx("1.xlsx",1)
#報錯資訊如下
Error in loadWorkbook(file, password = password) : Cannot find 1.xlsx
#解決辦法
setwd ( ) #這是設定所需讀取檔案的工作路徑的函數, 路徑記得加雙引號或者單引號。

Tips:在讀取前檔案前用setwd()來設定絕對路徑是一種方法,但這樣得保證每次所用資料都必須在同一個工作路徑才可以,並且得清楚這個路徑的名稱(這裡可以從我的電腦去複製貼上路徑),否則都需要改。然而,通常我們的資料都是根據個人情況分別放在不同的資料夾,即工作路徑都不同。因此,每次讀取檔案前,我在這裡推薦大家用這個方法選擇工作路徑(choose directory)以解決上述問題:

當前路徑需要修改

## 第二種情況
setwd (XXXX)
mydata <- read.xlsx("1.xlsx",1)
#報錯資訊與第一種情況一樣
#解決辦法
getwd ( ) #這是檢查當前工作路徑的函數
setwd ( )

選擇好後,我們會在console這個介面看到一個路徑,如:I:/作業就是我們的當前工作路徑。在R裡面所有的操作,匯入匯出檔案都會儲存在這個路徑下。

第二類:物件名或函數名問題

未找到函數名報錯

如下:Could not find function "XXX"等等,這個報錯是屬於程式包沒有載入的問題。因此,在使用某個函數時,首先要清楚知道該函數屬於哪個程式包裡的,並先用library()讀取該程式包,然後再執行該函數即可。

mydata <- read.xlsx("1.xlsx",1)
## 報錯資訊如下
Error in read.xlsx("1.xlsx", 1) : could not find function "read.xlsx"
### 解決辦法
library(openxlsx)
mydata <- read.xlsx("1.xlsx",1)mydata <-read.xlsx("1.xlsx",1)

如果不清楚該函數是哪個程式包,我們可以用?“read.xlsx"或 help(“xx”)來諮詢,諮詢結果如下:紅色框即為所需要的程式包,需要注意的是在諮詢的時候必要時需加上引號” "。

函數名大小寫問題

我們在呼叫程式R包、函數名時,要注意一個小問題–字母的大小寫。這裡,我直接用例子給大家展示:head ( )、Head ( )以及HEAD ( )這裡只有第一個函數名是能夠正常執行的,因為在R語言中只存在自帶函數名的字母大小寫,也就是說,程式中不會預設都是大寫或者都是小寫。

## R語言程式包大小寫錯誤
library(Openxlsx)
## 報錯資訊如下
Error in library("Openxlsx") : there is no package called ‘Openxlsx'
## 更正後
library("openxlsx")

## 函數名大小寫錯誤
mydata <- Read.xlsx("I:\R language\R語言鄭師兄程式碼\圖一.xlsx",2)
## 報錯資訊如下
Error in Read.xlsx("I:\R language\R語言鄭師兄程式碼\圖一.xlsx", 2) :
  could not find function "Read.xlsx"
## 更正大小寫後
mydata <- read.xlsx("I:\R language\R語言鄭師兄程式碼\圖一.xlsx",2)
## 另外一個example
Head(mydata)
## 報錯資訊如下
Error in Head(mydata) : could not find function "Head"
## 更正後
head(mydata)

錯誤結果和更正展示

未找到賦值物件

如下:object ‘xxx’ not found,這類報錯比較直觀,就是如錯誤所描述的:找不到目標的問題。在下面例子中,就是報錯資訊中的a找不到。通常可能是你自己在執行程式碼時候,run 的太快了,上一行的資料讀取資訊還沒讀,就緊接著跑下一行程式碼,所以會出現第二行程式碼報錯,沒有找到a這個變數。以後出現這類錯誤時,只需要檢視一下自己環境變數是否缺少該目標變數,如果缺少了補充上就可以了。

## 這類錯誤檢查環境變數中是否存在所需目標
library(ggplot2)
library(datasets)
data(package="datasets") ## 檢視該程式包裡含有哪些資料集
data(iris)
head(iris)
b <- a[-1]
## 報錯資訊如下
Error: object 'a' not found
## 解決辦法
## 補充目標變數即可
a <- data.frame(iris$Species,iris$Sepal.Width)
b <- a[-1]

個人建議:在報錯時,先檢查下環境變數中的變數,是否能找到所需要的目標。如果沒有的話,把目標變數讀取後再執行報錯的程式碼即可。

物件賦值不規範

如下:unexpected symbol in “1r”,這類錯誤也是新手會犯的,但這類錯誤很簡單,我們在定義目標變數的時候,不能用數位作為定義名。這裡我提供一個思路去理解,如果可以用數位打頭,也需要加上字母:例如1+UUU; 1+AALL。然而這些不能作為變數名,因為編譯器不能區分究竟是數位還是變數名。利用數位和字母一起顯然沒有隻用字母來的簡便,索性就去掉了。因此,我們需要記住的是,在定義目標變數名稱的時候不能用數位打頭。

## 數位打頭不能做變數名的錯誤
1r <- iris$Species
## 報錯資訊如下
Error: unexpected symbol in "1r"
## 解決辦法
## 把數位去掉,只用字母作為變數名
r <- iris$Species

第三類:符號問題

中文逗號報錯

如下:unexpected input in ‘XXX’, 這類錯誤是初學者常遇到的–中英文標點符號問題。新手在出現這類報錯時,第一反應應該檢視報錯的位置 Error in 停在哪裡。在下面例子中,句子停在了Species,"之後,通過仔細檢視程式碼,能夠發現句子中報錯的位置是一箇中文格式的逗號。因此,把中文格式的逗號改成英文格式即可,這種報錯只要在R語言練習一段時間後就基本不會再煩了。

## 這類錯誤需要檢查中英文標點符號
library(ggplot2)
library(datasets)
data(package="datasets") ## 檢視該程式包裡含有哪些資料集
data (iris)
head (iris)
a <- data.frame(iris$Species ,iris$Sepal.Width)
## 報錯資訊如下
Error: unexpected input in "a <- data.frame(iris$Species ,?"
## 解決辦法
## 將中文的標點符號改成英文模式下的即可
a <- data.frame(iris$Species, iris$Sepal.Width)

個人建議:由於rstudio剛開始使用時用的是預設的背景模板,為了在學習過程中節省一些時間,提高程式碼的準確率,可以用下面方法更換一下背景模板,選擇一種最適合自己的模板,減少不必要的錯誤。

絕對路徑的設定符號使用不規範

如下:unexpected input in “setwd(I:”,是路徑未設定成功,但是根本報錯是因為路徑符號不對導致的。我們需要清楚在R語言中參照地址的時候,需要注意是’/‘還是’‘(單向左還是雙向右下的斜槓)。如果在地址參照時,用了’//‘或’‘就會報錯。下面我們用例子來展示,我們發現我們在設定路徑時,符號用錯了,直接報錯。在讀取資料時,工作路徑的符號也用錯了,出現了同樣的報錯。這裡,我們只需要熟記一點,在R語言中要用’/’ or ''即可。

## 這類報錯也屬於符號使用錯誤
setwd("I:R languageR語言鄭師兄程式碼")
## 報錯資訊如下
Error: unexpected input in "setwd(I:"
## 解決辦法
## 把''改成 '/' or '\'
setwd("I:\R language\R語言程式碼")
setwd("I:/R language/R語言程式碼")

## 同樣是工作路徑的情況
library(openxlsx)
mydata <- read.xlsx("I:R languageR語言程式碼圖一.xlsx",2)
## 報錯資訊如下
Error: 'R' is an unrecognized escape in character string starting ""I:R" 
## 解決方法 與上述相同
mydata <- read.xlsx("I:\R language\R語言程式碼\圖一.xlsx",2)

報錯結果如下:

更正後結果:

缺少括號或引號

如下:unexpected symbol in: “XXX”,這類報錯是比較常見且簡單的,屬於缺少or多餘符號。這類錯誤出現時,應該第一時間檢視error中出現報錯的位置,出現問題的地方在兩個報錯的兩個雙引號" "之間,因此應該出現在第一行和第二行程式碼之間。下面的例子中,我們發現缺少了括號,因此我們在程式碼的最後把括號補充上後,問題就解決了。

## 這類報錯屬於多餘或缺少符號
library(ggplot2)
library(datasets)
data(package="datasets") ## 檢視該程式包裡含有哪些資料集
data(iris)
head(iris)
a <- data.frame(iris$Species,iris$Sepal.Width)
mydata <- iris
mydata <- as.data.frame(t(dat[,as.character(a$Species)]) # 這裡看出少了一個括號。
mydata
## 報錯資訊如下
Error: unexpected symbol in: 
"mydata < as.data.frame(t(dat[,as.character(a$Species)])
mydata"
## 解決辦法
## 只需要刪除多餘和補充缺少的符號即可

個人建議:如果在輸入有括號的程式碼時,可以把滑鼠在每個右半邊的括號點一下,rstudio會自帶提醒這一組括號是否完成輸入:當前括號表示是第二個左半邊括號,因此需要在最右邊再補充一個括號。

賦值號報錯

通常用這兩種方式來表示賦值,<- 或者 =。如果我們在去讀時候賦值號使用有誤,也會出現object ‘mydata’ not found。我用一個例子告訴大家,這裡不是因為沒有讀取之前的目標,而是在編輯程式碼的過程中可能因為粗心等因素出現程式碼的小錯誤。具體情況如下:

## 這類屬於未找到目標變數,但是屬於程式碼錯誤的問題
library(openxlsx)
mydata < - read.xlsx("I:\R language\R語言鄭師兄程式碼\圖一.xlsx",2)
## 報錯資訊如下
Error: object 'mydata' not found
## 仔細一看發現是賦值時候的符號被隔斷了
## 解決方法
< - 改寫成 <-即可

報錯如下

更正展示:

必要的引號與括號

我將這兩個易犯的小錯誤合一起與大家分享。第一,忘記使用必要的引號;第二,在使用函數名時忘記使用括號。其實,這兩類錯誤可能在之前也有提到一點。但是,這裡我單獨將他們拿出來講,考慮到這兩類錯誤新手特別容易犯。但是兩類錯誤也是特別容易解決,只要在寫程式碼的時候稍微小心一點就可以啦~圖片下面我用一些具體的例子和大家展示:

## 特別是安裝程式包時,必要的引號不能丟
install.packages(ggplot2)
## 報錯資訊如下
Error in install.packages : object 'ggplot2' not found
## 解決辦法
## 所需安裝的程式包加上引號即可
install.packages("ggplot2")

## 使用函數名時需要加括號,例如
help
## 報錯資訊如下
function (...)
## 解決辦法,在函數名後新增括號
help()
## 此外,需要強調並不是所有函數都可以使用空白括號的

特別提醒:並不是所有函數名都可以用 XXX ( )來查詢,有的函數名的括號內必須加入目標變數才可以存取。這裡舉一個簡單的例子:例如head ( )

第四類:中文註釋亂碼

註釋的資訊顯示亂碼,這是新手常遇到的問題。首先,註釋資訊在你每次編輯一條程式碼之前、中間以及之後都可以進行。其次,你每次編輯完註釋資訊儲存時都需要選擇一種encoding,也就是編碼方式。在windows系統下,read.csv ( )和read.table ( )方法不指定檔案格式時,預設讀取的格式為GBK(GB2312)。Rstudio裡面有設定預設文字編碼方式,但是修改前後讀入中文資料情況都一樣,encoding為UTF-8或GB2312都相同。然而,在Linux系統下,系統指定中文編碼方式是UTF-8,所以read.csv ( )和read.table ( )都要求UTF-8。如下兩個檔案,分別是UTF-8格式和GBK格式,首先用read.csv讀取,可以看到不指定編碼方式時,讀取UTF-8格式檔案是亂碼。用encoding指定讀取的檔案編碼方式為UTF-8後,正常。這樣看起來read.csv ( )方法讀取UTF-8好像可行?總結一下,如果大家看不懂上面這一串沒關係,在儲存檔案時選用UTF-8的編碼格式,以及在開啟一份code時,如果中文亂碼就用UTF-8開啟。無論儲存還是開啟檔案都選擇UTF-8格式即可。

如下情況


將編碼方式更改為UTF-8

下面是重新以UTF-8格式開啟一份程式碼

file—reopen with encoding—utf-8—ok

第五類:資料集或變數長度不同

如下: ‘x’ and ‘w’ must have the same length, 這類錯誤也是較為常見的報錯–通常為兩個資料框的資料行與列長度不同。新手在出現這類報錯時,第一反應看你在讀取兩個資料框時的資料行列數是否滿足長度對等關係。我們通過下面例子來講解這個報錯需要注意的問題:我們在做一些需要兩個資料集的分析時(例如beta分析,即在探究環境因子與微生物群落的關係時的一些距離分析,特別需要注意這個行列對等問題,因為程式碼只能識別行列對等的矩陣。這裡,我們要記住讀取資料時的幾個比較重要的函數,header=T 這是個預設的函數,header=T 表示第一行設為每列的列名,這是預設程式碼,如果不需要可以將T改為F。row.names=1表示第一列設為每行的行名。有這個程式碼,意味著會少一列,注意這個函數在使用時要保證沒有重複的名稱。

## x和w長度需要一致,即兩個矩陣的行列長度要對等
library(vegan)
library(grid)
env=read.csv("env(1)(1).csv", header=T, sep=",", row.names = 1) # read.csv讀取csv格式的資料
env=data.matrix(env) # 將資料框轉化為矩陣
env[is.na(env)]=0 # 去掉資料為0的值
speciesdata=read.csv("OTU(2).csv", header=T, sep=",") 
speciesdata=data.matrix(speciesdata)
speciesdata[is.na(speciesdata)]=0
speciesdata=t(speciesdata)
speciesdata.cca=cca(speciesdata,env) #進行CCA分析
## 報錯資訊如下
Error in weighted.mean.default(newX[, i], ...) :
  'x' and 'w' must have the same length
## 解決辦法
## 由於是兩個資料框的長度不同,那麼只要將兩個資料框對齊即可
speciesdata=read.csv("OTU(2).csv",header=T, sep=",") ## 在這行程式碼新增 row.names=1
speciesdata=read.csv("OTU(2).csv",header=T, sep=",",row.names=1)# 讓430列變成429列 與第一矩陣長度相等

錯誤結果

更正展示

個人建議:這類報錯–兩個資料框/矩陣行列不對等時,我們在每讀取一個檔案時應該先看看環境中的資料框,可以用滑鼠點開資料框,看看資料框讀取的結果與自己預期的結果以及在正常excel下開啟的是否一致,再去判斷在執行程式碼時能否成功等等。

補充:有一些錯誤是R的初學者和經驗豐富的R程式設計師都可能常犯的。

如果程式出錯了,請檢查一下幾個方面。

  • 使用了錯誤的大小寫。help(),Help() 和 HELP() 是三個不同的函數(只有第一個是正確的)。
  • 忘記使用必要的引號。install.packages("gclus") 能夠正常執行,然後Install.packages(gclus)將會報錯。
  • 在函數呼叫時忘記使用括號。例如,要使用help()而非help。即使函數無需引數,仍需加上()。
  • 在Windows上,路徑名中使用了。R將反斜槓視為一個跳脫字元。setwd("c:mydata")會報錯。正確的寫法是setwd("c:/mydata")或setwd("c:\mydata")。
  • 使用了一個尚未載入包中的函數。函數order.cluster()包含在包gclus中。如果還沒有載入這個包就使用它,將會報錯。

R的報錯資訊可能是含義模糊的,但如果謹慎遵守了以上要點,就應該可以避免許多錯誤。

總結

到此這篇關於R語言初學者的一些常見報錯指南的文章就介紹到這了,更多相關R語言常見報錯內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com