寫在前面
本系列推文為《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/
目錄
-
2.1 編程基礎
-
2.2 注釋
-
2.3 名稱叫什么?
-
2.4 調用函數
-
2.5 練習
-
2.6 總結
你現在已經有一些運行 R 代碼的經驗了。雖然我們沒有給你太多細節,但顯然你已經掌握了基礎知識,否則你就會因為沮喪而放棄這本書了!當你開始使用 R 編程時,沮喪是很自然的,因為它對標點符號非常嚴格,即使一個字符放錯位置也會引起錯誤。但是盡管你可能會感到一些挫敗,要安慰自己的是,這種經歷是典型的和暫時的:每個人都會經歷這個階段,克服它的唯一辦法就是不斷嘗試。
在我們繼續之前,讓我們確保你在運行 R 代碼方面有堅實的基礎,并且了解一些最有幫助的 RStudio 功能。
2.1 編程基礎
讓我們回顧一些基礎知識,為了盡快讓您開始繪圖,我們在之前省略了一些內容。您可以使用 R 進行基本的數學計算:
1?/?200?*?30
#>?[1]?0.15
(59?+?73?+?2)?/?3
#>?[1]?44.66667
sin(pi?/?2)
#>?[1]?1
您可以使用賦值運算符 <-
創建新的對象:
x?<-?3?*?4
請注意,變量 x
的值不會被打印出來,它只是被存儲起來了。如果您想查看該值,請在控制臺中輸入 x
。
您可以使用 c()
將多個元素組合(combine)成一個向量:
primes?<-?c(2,?3,?5,?7,?11,?13)
對向量進行基本的算術運算會應用到向量的每個元素:
primes?*?2
#>?[1]??4??6?10?14?22?26
primes?-?1
#>?[1]??1??2??4??6?10?12
所有在 R 中創建對象的語句,也就是賦值(assignment)語句,都具有相同的形式:
object_name?<-?value
在閱讀這段代碼時,在腦海中可以說 “object name gets value”。
您將會進行很多賦值操作,而 <-
的輸入可能會很麻煩。您可以使用 RStudio 的快捷鍵來節省時間:Alt + - (減號)。請注意,RStudio 會自動在 <-
周圍添加空格,這是一個很好的代碼格式化習慣。代碼有時可能很難閱讀,因此請給你的眼睛一些休息,并使用空格來提高可讀性。
2.2 注釋
R 會忽略 #
后面的任何文本。這允許您編寫注釋(comments),即 R 忽略但供其他人閱讀的文本。我們有時會在示例中包含注釋,以解釋代碼的運行過程。
注釋可以用于簡要描述以下代碼的作用。
#?create?vector?of?primes
primes?<-?c(2,?3,?5,?7,?11,?13)#?multiply?primes?by?2
primes?*?2
#>?[1]??4??6?10?14?22?26
像這樣的短小代碼片段,可能不需要為每一行代碼都留下注釋。但是當你編寫的代碼變得更加復雜時,注釋可以節省你(和你的合作者)很多時間,幫助你理解代碼的操作。
使用注釋來解釋代碼的 why,而不是 how 或 what。代碼的 what 和 how 總是可以通過仔細閱讀來弄清楚,即使可能會有些繁瑣。如果你在注釋中描述了每個步驟,然后更改了代碼,你就必須記住同時更新注釋,否則當你將來返回到代碼時會感到困惑。
弄清楚 why 某些事情被做是更加困難的,甚至是不可能的。例如,geom_smooth()
函數有一個名為 span
的參數,用于控制曲線的平滑程度,較大的值會產生更平滑的曲線。假設你決定將 span
的值從默認的 0.75 更改為 0.9:未來的讀者很容易理解正在發生的是 what,但除非你在注釋中記錄你的思考過程,否則沒有人會明白你 why 改變了默認值。
對于數據分析代碼,使用注釋來解釋你的整體攻擊計劃,并在遇到重要發現時記錄下來。從代碼本身無法重新獲取這些知識。
2.3 名稱叫什么?
對象名稱必須以字母開頭,只能包含字母、數字、_
和 .
。你希望你的對象名稱具有描述性,因此你需要采用一種適用于多個單詞的約定。我們推薦使用蛇形命名法(snake_case),其中你用下劃線(_
)分隔小寫單詞。
i_use_snake_case
otherPeopleUseCamelCase
some.people.use.periods
And_aFew.People_RENOUNCEconvention
當我們在 Chapter 4
中討論代碼風格時,我們將再次回到命名問題。
你可以通過輸入對象的名稱來檢查它:
x
#>?[1]?12
提供另一個賦值:
this_is_a_really_long_name?<-?2.5
要檢查這個對象,可以嘗試使用 RStudio 的自動補全功能:輸入 "this",按下 TAB 鍵,在唯一前綴之前添加字符,然后按回車鍵。
假設你犯了一個錯誤,this_is_a_really_long_name
的值應該是 3.5,而不是 2.5。你可以使用另一個鍵盤快捷鍵來幫助你進行修正。例如,你可以按 ↑ 鍵來調出你最后輸入的命令并進行編輯。或者,輸入 “this”,然后按下 Cmd/Ctrl + ↑ 鍵,以列出以這些字母開頭的所有命令。使用箭頭鍵導航,然后按回車鍵重新輸入命令。將 2.5 更改為 3.5 并重新運行。
提供另一個賦值:
r_rocks?<-?2^3
讓我們嘗試檢查它:
r_rock
#>?Error:?object?'r_rock'?not?found
R_rocks
#>?Error:?object?'R_rocks'?not?found
這說明了你和 R 之間的默契協議:R 會為你完成繁瑣的計算,但作為交換,你必須在指令上完全準確。如果不準確,你可能會收到一個錯誤,提示找不到你要查找的對象。拼寫錯誤是有影響的;R 無法讀懂你的心思,說:“哦,他們在輸入 r_rock
時可能是想表達 r_rocks
。” 大小寫也很重要;同樣,R 無法讀懂你的心思,說:“哦,他們在輸入 R_rocks
時可能是想表達 r_rocks
。”
2.4 調用函數
R 有一個龐大的內置函數集合,調用方式如下所示:
function_name(argument1?=?value1,?argument2?=?value2,?...)
讓我們嘗試使用 seq()
函數,它可以創建序列(sequences)的數字。同時,我們也可以了解一些 RStudio 的其他有用功能。輸入 se
,然后按下 TAB 鍵。一個彈出窗口將顯示可能的自動補全選項。通過輸入更多字符(例如,q
)來指定 seq()
,以消除歧義,或者使用 ↑/↓ 箭頭選擇。注意彈出的浮動工具提示,提醒你函數的參數和用途。如果需要更多幫助,按下 F1 鍵可以在右下方的幫助選項卡中獲取所有細節。
當你選擇了你想要的函數后,再次按下 TAB 鍵。RStudio 將會為你添加匹配的左括號((
)和右括號()
)。 輸入第一個參數的名稱 from
,并將其設置為 1
。然后,輸入第二個參數的名稱 to
,并將其設置為 10
。最后,按下回車鍵。
seq(from?=?1,?to?=?10)
#>??[1]??1??2??3??4??5??6??7??8??9?10
在函數調用中,我們經常省略前幾個參數的名稱,因此我們可以將其重寫如下:
seq(1,?10)
#>??[1]??1??2??3??4??5??6??7??8??9?10
輸入以下代碼,并注意 RStudio 提供了類似的幫助來配對引號:
x?<-?"hello?world"
引號和括號必須總是成對出現。RStudio 盡力幫助你,但仍然有可能出錯,導致不匹配。如果出現這種情況,R 會顯示續行字符 “+”:
>?x?<-?"hello
+
+
符號告訴你 R 正在等待更多的輸入;它認為你還沒有完成。通常,這意味著你可能忘記了一個 "
或者一個 )
。要么添加缺失的配對,要么按下 ESCAPE 鍵中斷表達式,然后重試。
請注意,右上方的環境選項卡(Environment tab)顯示了你創建的所有對象:
?
2.5 練習
-
為什么這段代碼不工作?
my_variable?<-?10
my_var?able
#>?Error:?object?'my_var?able'?not?found
仔細看!(這可能看起來毫無意義,但當你編程時,訓練你的大腦注意到即使是微小的差異也會有所回報。)
-
調整以下每個 R 命令,使其能夠正確運行:
libary(todyverse)ggplot(dTA?=?mpg)?+?geom_point(maping?=?aes(x?=?displ?y?=?hwy))?+geom_smooth(method?=?"lm)
-
按下 Option + Shift + K / Alt + Shift + K。會發生什么? 如何通過菜單到達相同的位置?
-
讓我們重新審視
Section 1.6
中的一個練習。運行以下代碼行。兩個圖中的哪一個會保存為mpg-plot.png?
為什么?
my_bar_plot?<-?ggplot(mpg,?aes(x?=?class))?+geom_bar()
my_scatter_plot?<-?ggplot(mpg,?aes(x?=?cty,?y?=?hwy))?+geom_point()
ggsave(filename?=?"mpg-plot.png",?plot?=?my_bar_plot)
2.6 總結
現在你對 R 代碼的工作原理有了更多了解,還學到了一些提示,可以幫助你在將來回顧代碼時更好地理解它。
在下一章中,我們將繼續你的數據科學之旅,教你如何使用 dplyr 這個 tidyverse 包來轉換數據,無論是選擇重要變量、篩選感興趣的行,還是計算摘要統計信息。
?
--------------- 本章結束 ---------------
?
本期翻譯貢獻:
-
@TigerZ生信寶庫
?