寫在前面
本系列推文為《R for Data Science (2)》的中文翻譯版本。所有內容都通過開源免費的方式上傳至Github,歡迎大家參與貢獻,詳細信息見:
Books-zh-cn 項目介紹:
Books-zh-cn:開源免費的中文書籍社區
r4ds-zh-cn Github 地址:
https://github.com/Books-zh-cn/r4ds-zh-cn
r4ds-zh-cn 網站地址:
https://books-zh-cn.github.io/r4ds-zh-cn/
目錄
-
6.1 腳本
-
6.2 項目
-
6.3 練習
-
6.4 總結
本章將向您介紹組織代碼的兩個基本工具:腳本(scripts)和項目(projects)。
6.1 腳本
到目前為止,您已經使用控制臺(console)來運行代碼。這是一個很好的起點,但是當您創建更復雜的 ggplot2 圖形和更長的 dplyr 管道時,您會發現它很快就會變得擁擠。為了給自己更多的工作空間,請使用腳本編輯器。單擊 File 菜單,選擇 New File,然后選擇 R script,或使用鍵盤快捷鍵 Cmd/Ctrl + Shift + N 將其打開。現在您將看到四個窗格,如 Figure 6.1
所示。腳本編輯器是試驗代碼的好地方。當您想要更改某些內容時,不必重新輸入整個內容,只需編輯腳本并重新運行即可。一旦您編寫了可以運行并執行您想要的操作的代碼,您就可以將其保存為腳本文件,以便稍后輕松返回。
?
Figure 6.1: 打開腳本編輯器會在 IDE 的左上角添加一個新窗格。
6.1.1 運行代碼
腳本編輯器是構建復雜 ggplot2 繪圖或長序列 dplyr 操作的絕佳場所。有效使用腳本編輯器的關鍵是記住最重要的鍵盤快捷鍵之一:Cmd/Ctrl + Enter。這將在控制臺中執行當前的 R 表達式。例如,采用下面的代碼。
library(dplyr)
library(nycflights13)not_cancelled?<-?flights?|>?filter(!is.na(dep_delay)█,?!is.na(arr_delay))not_cancelled?|>?group_by(year,?month,?day)?|>?summarize(mean?=?mean(dep_delay))
如果光標位于 █ 處,按 Cmd/Ctrl + Enter 將運行生成 not_cancelled
的完整命令。它還會將光標移動到以下語句(以 not_cancelled |>
開頭)。這樣可以通過重復按 Cmd/Ctrl + Enter 輕松地逐步執行完整的腳本。
您還可以使用 Cmd/Ctrl + Shift + S 一步執行完整的腳本,而不是逐個表達式地運行代碼。定期執行此操作是確保您捕獲腳本中代碼的所有重要部分的好方法。
我們建議您始終使用所需的包來啟動腳本。這樣,如果您與其他人共享代碼,他們可以輕松查看需要安裝哪些軟件包。但請注意,您絕對不應該在共享的腳本中包含 install.packages()
。如果他們不小心的話,交出一個會改變他們計算機上某些內容的腳本是不體貼的!
在學習后續章節時,我們強烈建議從腳本編輯器開始并練習鍵盤快捷鍵。隨著時間的推移,以這種方式向控制臺發送代碼將變得如此自然,您甚至不會想到它。
6.1.2 RStudio 診斷
在腳本編輯器中,RStudio 將使用紅色波浪線和側邊欄中的十字來突出顯示語法錯誤:
?
將鼠標懸停在十字上即可查看問題所在:
?
RStudio 還會讓您了解潛在的問題:
?
6.1.3 保存和命名
當您退出時,RStudio 會自動保存腳本編輯器的內容,并在您重新打開時自動重新加載。盡管如此,最好避免使用 Untitled1、Untitled2、Untitled3 等,而是保存腳本并為它們提供信息豐富的名稱。
將文件命名為 code.R
或 myscript.R
可能很誘人,但在為文件選擇名稱之前應該仔細考慮一下。文件命名的三個重要原則如下:
-
文件名應該是機器可讀的(machine readable):避免空格、符號和特殊字符。不要依靠大小寫來區分文件。
-
文件名應該是人類可讀的(human readable):使用文件名來描述文件中的內容。
-
文件名應該與默認順序配合良好:以數字開頭的文件名,以便按字母順序排序將它們按照使用的順序排列。
例如,假設項目文件夾中有以下文件。
alternative?model.R
code?for?exploratory?analysis.r
finalreport.qmd
FinalReport.qmd
fig?1.png
Figure_02.png
model_first_try.R
run-first.r
temp.txt
這里存在各種各樣的問題:很難找到先運行哪個文件、文件名包含空格、有兩個同名但大小寫不同的文件(finalreport
vs. FinalReport
)、有些名稱沒有描述其內容(run-first
and temp
)。
這是命名和組織同一組文件的更好方法:
01-load-data.R
02-exploratory-analysis.R
03-model-approach-1.R
04-model-approach-2.R
fig-01.png
fig-02.png
report-2022-03-20.qmd
report-2022-04-02.qmd
report-draft-notes.txt
對關鍵腳本進行編號可以清楚地顯示運行它們的順序,并且一致的命名方案可以更容易地看到差異。此外,數字的標簽類似,報告通過文件名中包含的日期進行區分,并且 temp
被重命名為 report-draft-notes
以更好地描述其內容。如果一個目錄中有很多文件,建議進一步組織,將不同類型的文件(scripts, figures, etc.)放在不同的目錄中。
6.2 項目
有一天,您需要退出 R,去做其他事情,然后再返回分析。有一天,您將同時進行多項分析,并且希望將它們分開。有一天,您需要將外部世界的數據引入 R,并將 R 中的數值結果和數字發送回外部世界。
為了處理這些現實生活中的情況,您需要做出兩個決定:
-
真實來源是什么?您將保存什么作為所發生事件的永久記錄?
-
您的分析在哪里?
6.2.1 真實的來源是什么?
作為初學者,可以依賴當前的環境來包含您在分析過程中創建的所有對象。但是,為了更輕松地處理大型項目或與其他人協作,您的真實來源應該是 R scripts。使用 R scripts(和數據文件),您可以重新創建環境。僅在您的環境中,重新創建 R scripts 要困難得多:您要么必須從內存中重新輸入大量代碼(一路上不可避免地會犯錯誤),要么必須仔細挖掘您的 R history。
為了幫助將 R scripts 保留為分析的真實來源,我們強烈建議您指示 RStudio 不要在會話之間保留工作區。您可以通過運行 usethis::use_blank_slate()
或 Figure 6.2
中所示的選項來完成此操作。這會給您帶來一些短期的痛苦,因為現在當您重新啟動 RStudio 時,它將不再記住您上次運行的代碼,也不會再使用您創建的對象或讀取的數據集。但這種短期的痛苦可以避免長期的痛苦,因為它迫使您捕獲代碼中的所有重要過程。沒有什么比三個月后發現您只將重要計算的結果存儲在環境中,而不是計算本身存儲在代碼中更糟糕的了。
?
Figure 6.2: 將這些選項復制到你的 RStudio 選項中,以便始終從頭開始啟動 RStudio 會話。
有一對很棒的鍵盤快捷鍵可以協同工作,以確保您在編輯器中捕獲了代碼的重要部分:
-
按 Cmd/Ctrl + Shift + 0/F10 重新啟動 R。
-
按 Cmd/Ctrl + Shift + S 重新運行當前腳本。
我們每周都會使用這種模式數百次。
或者,如果您不使用鍵盤快捷鍵,則可以轉到 Session > Restart R,然后突出顯示并重新運行當前腳本。
RStudio server
如果您使用 RStudio server,默認情況下您的 R 會話永遠不會重新啟動。當您關閉 RStudio server 選項卡時,可能感覺您正在關閉 R,但服務器實際上讓它在后臺運行。下次您返回時,您將位于與離開時完全相同的位置。這使得定期重新啟動 R 變得更加重要,這樣您才能從頭開始。
6.2.2 您的分析位置在哪里?
R 有一個強大的工作目錄(working directory)概念。這是 R 查找您要求其加載的文件的位置,也是放置您要求其保存的任何文件的位置。RStudio 在控制臺頂部顯示您當前的工作目錄:
?
您可以通過運行 getwd()
在 R 代碼中打印出來:
getwd()
#>?[1]?"/Users/hadley/Documents/r4ds"
在此 R 會話中,當前工作目錄(將其視為"home")位于 hadley 的 Documents 文件夾中名為 r4ds 的子文件夾中。當您運行此代碼時,它會返回不同的結果,因為您的計算機的目錄結構與 Hadley 的不同!
作為 R 初學者,可以將工作目錄設置為主目錄、文檔目錄或計算機上任何其他奇怪的目錄。但你已經讀了這本書的七章,并且你不再是初學者了。很快您就應該將項目組織到目錄中,并且在處理項目時將 R 的工作目錄設置為關聯的目錄。
您可以在 R 中設置工作目錄,但我們不推薦這樣做:
setwd("/path/to/my/CoolProject")
有一個更好的方法;這種方式還可以讓您像專家一樣管理您的 R 工作。就是 RStudio project。
6.2.3 RStudio projects
將與給定項目關聯的所有文件(input data, R scripts, analytical results, and figures)保存在一個目錄中是一種明智且常見的做法,RStudio 通過項目(projects)對此提供了內置支持。讓我們創建一個 project 供您在學習本書其余部分時使用。單擊 File > New Project,然后按照 Figure 6.3
中所示的步驟操作。
?
Figure 6.3: 要創建 new project:(top)首先單擊 New Directory,然后(middle)單擊 Create Project,然后(bottom)填寫目錄(project)名稱,選擇一個好的子目錄作為其主目錄,然后單擊 Create Project。
將您的項目命名為 r4ds
,并仔細考慮將項目放在哪個子目錄中。如果您不將其存儲在合理的地方,將來將很難找到它!
此過程完成后,您將獲得一個專門用于本書的新 RStudio 項目。檢查項目的 "home" 是否是當前工作目錄:
getwd()
#>?[1]?/Users/hadley/Documents/r4ds
現在在腳本編輯器中輸入以下命令,然后保存文件,將其命名為 "diamonds.R"。然后,創建一個名為 "data" 的新文件夾。您可以通過單擊 RStudio Files 窗格中的 "New Folder" 按鈕來完成此操作。最后,運行完整的腳本,將 PNG 和 CSV 文件保存到您的項目目錄中。不用擔心細節,你會在本書后面學到它們。
library(tidyverse)ggplot(diamonds,?aes(x?=?carat,?y?=?price))?+?geom_hex()
ggsave("diamonds.png")write_csv(diamonds,?"data/diamonds.csv")
退出 RStudio。檢查與您的項目關聯的文件夾 --- 注意 .Rproj
文件。雙擊該文件以重新打開該項目。請注意,您回到了上次離開的位置:它是相同的工作目錄和命令歷史記錄,并且您正在處理的所有文件仍然打開。然而,由于您遵循了我們上面的說明,因此您將擁有一個全新的環境,保證您從頭開始。
以您最喜歡的特定于操作系統的方式,在計算機中搜索 diamonds.png
,您會找到 PNG(毫不奇怪),而且還會找到創建它的腳本(diamonds.R
)。這是一個巨大的勝利!有一天,您會想要重新制作一個人物,或者只是想了解它的來源。如果您使用 R 代碼嚴格地將圖形保存到文件中,而不是使用鼠標或剪貼板,那么您將能夠輕松地重現舊作品!
6.2.4 相對和絕對路徑
一旦進入項目,您應該只使用相對路徑而不是絕對路徑。有什么不同?相對路徑是相對于工作目錄的,即項目的主目錄。當 Hadley 在上面寫入 data/diamonds.csv
時,它是 /Users/hadley/Documents/r4ds/data/diamonds.csv
的快捷方式。但重要的是,如果 Mine 在她的計算機上運行此代碼,它將指向 /Users/Mine/Documents/r4ds/data/diamonds.csv
。這就是為什么相對路徑很重要:無論 R 項目文件夾位于何處,它們都會起作用。
無論您的工作目錄如何,絕對路徑都指向同一位置。根據您的操作系統,它們看起來略有不同。在 Windows 上,它們以驅動器號(例如 C:
)或兩個反斜杠(例如 \\servername
)開頭,在 Mac/Linux 上,它們以斜杠"/"開頭(例如 /users/hadley
)。您永遠不應該在腳本中使用絕對路徑,因為它們會妨礙共享:其他人不會擁有與您完全相同的目錄配置。
操作系統之間還有另一個重要的區別:如何分離路徑的組成部分。Mac 和 Linux 使用斜杠(例如 data/diamonds.csv
),Windows 使用反斜杠(例如 data\diamonds.csv
)。R 可以使用任何一種類型(無論您當前使用什么平臺),但不幸的是,反斜杠對 R 來說意味著一些特殊的東西,并且要在路徑中獲得單個反斜杠,您需要鍵入兩個反斜杠!這讓生活變得令人沮喪,因此我們建議始終使用帶有正斜杠的 Linux/Mac 風格。
6.3 練習
-
轉到 RStudio Tips Twitter account,https://twitter.com/rstudiotips 并找到一個看起來有趣的提示。練習使用它!
-
RStudio 診斷還會報告哪些其他常見錯誤?閱讀 https://support.posit.co/hc/en-us/articles/205753617-Code-Diagnostics 找出。
6.4 總結
在本章中,您學習了如何在 scripts (files) 和 projects (directories) 中組織 R 代碼。 就像代碼風格一樣,一開始這可能感覺像是在忙活。但是,當您在多個項目中積累更多代碼時,您將學會欣賞一點預先的組織如何可以為您節省大量時間。
總之,scripts 和 projects 為您提供了可靠的工作流程,將在未來為您提供良好的服務:
-
為每個數據分析項目創建一個 RStudio project。
-
將腳本(具有信息豐富的名稱)保存在項目中,對其進行編輯,部分或整體運行它們。經常重新啟動 R 以確保您已捕獲腳本中的所有內容。
-
只使用相對路徑,而不是絕對路徑。
然后,您需要的所有內容都集中在一處,并與您正在處理的所有其他項目完全分開。
到目前為止,我們已經使用了 R 包中捆綁的數據集。這樣可以更輕松地對預先準備的數據進行一些練習,但顯然您的數據無法以這種方式獲得。因此,在下一章中,您將學習如何使用 readr 包將數據從磁盤加載到 R 會話中。
?
--------------- 本章結束 ---------------
?
本期翻譯貢獻:
-
@TigerZ生信寶庫
?