1 前言

這本電子書前身是我之前在當助教時所集合的問題集,後來發現有類似問題的人蠻多的,於是現在就開放給大家查詢,另外由於我使用的是windows,故問題、解決方法與圖例皆以windows介面為主,基本上可以說是為了windows使用者而寫的電子書。

若有內容錯誤或有其他建議的地方可透過下方表單回報,也歡迎提出沒有收錄的新問題或是提供解決辦法,詳細內容請閱讀表單說明。

(如果有課堂或私人使用需要只註明出處即可,當然如果方便留言回報我會很感謝。)


2 R & RStudio安裝

關於安裝軟體最重要的兩件事:

「當你看不懂他在幹嘛,別動任何東西」

「當你看到onedrive,肯定是哪裡有問題」

2.1 基礎安裝步驟

請按照以下步驟完成R與RStudio軟體安裝,並注意安裝路徑不可出現onedrive或其他雲端硬碟,安裝語言建議選擇英文:

  1. 下載R並安裝,版本依照電腦主系統選擇

  2. 下載RStudio並安裝,版本依照電腦主系統選擇(拉到最下面會有各系統對應版本)

若安裝成功,打開RStudio應可看到版面配置顯示如下(語言與主題色可能不同):

2.2 安裝失敗或無法使用

以下列舉幾項常出現的安裝問題與解方,若仍無法解決請聯絡助教或老師。:

2.2.1 路徑出現亂碼

請閱讀error通知,若為users後出現中文亂碼的情況大多是因為中文使用者名稱導致的路徑問題,請參閱7.3設定新使用者帳戶的方式新增英文名稱使用者,然後將R、RStudio、GitHub desktop等課程需要的軟體都安裝在新使用者帳戶,之後上課或使用RStudio時都用這個帳戶登入操作。
若亂碼並非緊接著Users/出現,只需更改該導致亂碼的中文資料夾名稱。

2.2.2 白畫面、無法開啟

請至C槽>使用者(路徑:C:\Users)確認使用者名稱是否為英文,若非英文使用者名稱的話,請參閱7.3設定新使用者帳戶的方式新增英文名稱使用者,然後將R、RStudio、GitHub desktop等課程需要的軟體都安裝在新使用者帳戶,之後上課或使用RStudio時都用這個帳戶登入操作。

2.2.3 下載好的RStudio不知道在哪裏

請參閱7.4,輸入RStudio搜尋,若無則表示未安裝成功。

2.3 package無法安裝

2.3.1 權限不足

關閉RStudio,重新以系統管理員身分開啟執行(可按右鍵or本機搜尋後如圖),之後都以這個方式開啟RStudio。

2.3.2 R版本過低

附圖為2020年初的對話,當前最新版本請以官網為主。


2.3.3 Windows10下載路徑誤植為OneDrive

這個問題我目前只聽到過一位外校同學反應,若有類似狀況請先參考這篇說明或嘗試以系統管理員身分開啟後安裝,若仍無法解決請聯絡助教或老師。


3 RStudio基本使用方式

3.2 如何存檔

就像word檔編輯完要存起來,程式的檔案編輯完也要存起來下次才會在,也才能被GitHub檢測到,才能commit和push

3.3 字體大小與個人使用設定

Tools>Global Options>Appearance,選擇字型、字體大小、背景設定等,可以按Apply預覽,確定後請按OK

3.4 R Script

條目編輯中…

3.5 R Markdown

R Script後延伸出的檔案類型,以更容易加註說明、文字、檔案輸出等為特質(例如這本電子書也是透過R Markdown進行編輯的)。

附圖為rmd檔幾種常見的語法與對應顯示方式(以html為例)。

3.5.1 rmd檔開啟

rmd檔是Rmarkdown檔的縮寫,要使用RStudio開啟,方式有以下兩種:

  1. 對rmd檔按右鍵>開啟檔案>以RStudio開啟
  2. 直接在RStudio點File>Open File選擇該檔案開啟

3.5.2 chunk

使用上相當於切成一小塊一小塊的R Script,可輸入程式碼或是#號註記,需同時存在上跟下界,如同上引號和下引號,可以底色區分。

可以用:

  1. 手動輸入、
  2. 點擊右上角insert>R
  3. ctrl+alt+i快捷鍵插入

※bonus小知識:{}裡的r代表要用r語言來讀這個chunk,R本身還可以使用python、c++、java等不同程式語言,因此當同一個任務中有許多不同語言使用需求時(ie. 先用Python爬資料,再把爬到的資料丟到R跑統計和圖表),使用rmd是非常方便的。

3.5.3 執行程式

方法一:按chunk右上角的綠色三角形執行整個chunk
方法二:ctrl+enter執行該行單行
方法三:從檔案右上角的run選取需要的執行方式

或參考老師電子書3.2

※bonus小知識:也可以用滑鼠選取配合ctrl+enter的方式執行特定內容喔。


4 亂碼、編碼問題

4.1 Rstudio環境設定

請先執行

Sys.getlocale()

檢查環境設定是否如下:

若非,請執行以下內容調整為中文環境:

Sys.setlocale(locale = "Chinese (Traditional)_Taiwan.950")

檢查設定是否成功:

Sys.getlocale()

設定成功結果如下:

4.3 資料讀取

若有特定資料無法正常讀取或顯示,可先透過Notepad++檢查原始檔案編碼後調整為UTF-8或UTF-8 BOM後再重新讀取。詳見8.1


5 基礎說明

5.1 物件(Object)

5.1.1 物件(Object)是甚麼

物件就是右邊environment中會顯示的東西(左邊是物件名稱、右邊是物件的描述),對很笨的電腦來說,不說清楚講明白一件事電腦是不能理解的,比方我們都知道三角形有三個邊三個頂點且內角和是180、1月1號是元旦、助教我超級可愛等等,但對電腦來說必須給予它明確的定義,也就是「名字」和「內容」的連結,這些被明確定義的東西就稱為物件。

就像阿花可以是一個人的名字也可以是一朵花或一個娃娃的名字,不管是外部引入的資料(data)或是自定義的程式(function)等等,只要是在R中被明確定義的任何內容都被稱作「物件」。

而當我們詢問「這個班上有誰」時,我們會回答人名而非性別、年齡等資訊,所以問object有甚麼時,我們也是要回答名字。

如下圖的定義就是「a」這個名字代表字串”a”、「是在」這個名字代表字串”哈樓”、「number」代表整數0、「numbers」代表內含三個整數的向量(可以想像成三格分別塞著1、2、3的一個叫numbers的三格櫃)。

5.1.2 物件命名

物件的命名需要使用到等號或是箭頭(=<-->),但命名的意義到底是甚麼呢?

想像你有一個空的儲藏室(environment),作為一個龜毛的人,你往裡面存放東西的時候,要將每一個東西或箱子、櫃子貼上標籤做紀錄,之後在找東西的時候才能根據標籤上貼著的名字找到他,其實這就是物件命名的邏輯和過程。

先試試幾個簡單的例子:

name <- "Flora,Wang"

# 若要將物件命名為中文,記得用反頓點``
`姓名` <- "王小花"
`零食` <- c("糖果","餅乾","巧克力")

進階題,思考一下107學年成績經濟學原理資料科學程式設計Python之間的關係;歷屆成績107學年成績108學年成績之間的關係。

# data frame
`107學年成績` <- data.frame(
  `經濟學原理` = c(82,82),
  `資料科學程式設計` = c(100,NA),
  Python = c(NA,85),
  row.names = c("上學期","下學期")
)

# list
`歷屆成績` <- list(
  `107學年成績` = `107學年成績`,
  `108學年成績` = NA
)

## 有甚麼有趣的發現嗎?

另外,由於R語言的物件命名並沒有方向的限制,也就是可以把左邊的內容存到右邊的物件名稱、也能把右邊的內容存到左邊的物件名稱,所以在R語言中使用箭頭來命名是較為推薦的方式,執行以下範例就能發現兩者意義相同。

"咪咪喵喵" -> meow
meow <- "咪咪喵喵"

相較於=,推薦使用箭頭的原因是箭頭的命名具有方向性,你可以想像名字是一個空位,箭頭就是把在箭頭後面的東西(內容)存放到箭頭前麼那個名字代表的空位,如果使用不具方向性的=來進行,有可能會發生物件內容亂掉的悲劇。

name <- "Flora,Wang"
`名字` <- "王小花"

# PK時間,猜猜看誰會被改掉?
name = `名字`

5.1.3 type、class & mode

簡而言之,這三個是東西是物件在不同使用狀況下的分類,他們有時一樣有時不同(雖然我們大部分只用class()就可以了),不過一般常見基本類型的有numeric、logical、character、list、vector、data frame等。

分別用你的眼睛、typeof()class()mode()觀察一下他們吧!

library(readr)
hello <- read_csv("https://www.dropbox.com/s/j5h23wqrlnuqkai/hello.csv?dl=1")
a <- "a"
`是在` <- c("哈樓","?")
number <- 0
numbers <- c(1:3,5)
fun <- function(){}
logic <- factor(1==2,1!=1,1<=2)

可以把list、vector、data frame這些想成不同款式的櫃子和盒子,櫃子和盒子裡可以裝各種糖果餅乾(numeric、logical、character),但糖果餅乾裡面當然不能放盒子跟櫃子。

動動腦:
那麼櫃子(list)的裡面可以放盒子(vector)嗎?

有興趣的人可以參考:https://kanchengzxdfgcv.blogspot.com/2019/01/r-class-mode-typeof.html

5.1.4 打了物件定義但environment沒東西

你有執行嗎?沒執行當然沒東西哇同學,google搜尋都要按enter了,程式當然也要按(執行)呀,它又不會通靈!!
你想想google如果每次都在你打要搜尋的東西之前就自動幫你搜尋好了那得多可怕!!

雖然現在Youtube的推薦真的已經準到你不知道你想看甚麼的時候他都先幫你找好了…

執行方式請參照3.5.3

延伸閱讀→108-2Q&A:library與執行順序

5.2 其他常見誤區

5.2.1 ===,甚麼是判斷式?

想補充一個我在課堂上發現的困難,就是初學者們好像很難去理解assign(=,<-)和equal(==)的差異,我有盡量用我的話跟學生解釋,但是學生們好像還是不理解。謝謝。

—— 投稿者:匿名

※建議先閱讀6.5.2了解物件命名的意義後再閱讀本章節。

在程式語言中,===分別屬於不同的系統,=用於命名/定義,他在R語言中的同系家屬還有<-->,如果已經閱讀過6.5.2、對於物件命名有相當程度認識的話,想必不難理解這個概念(如果忘記了趕快滑上去溫習!);==則用於邏輯判斷,同家族的成員還有>=<=!=這幾位。

第一次學習程式語言的同學可能會對於邏輯判斷的意義感到比較陌生,以下用幾個例子帶大家一起看看邏輯判斷在做的事情:

# 數學判斷
1+1 == 2 #1+1是不是2?
1 >= 2 #1是不是大於2?


# 有學生A與學生B兩人的資料
studentA <- c(`姓名` = "王小花", `科系` = "經濟系", `入學年` = "107學年")
studentB <- c(`姓名` = "李大草", `科系` = "經濟系", `入學年` = "109學年")

studentA["科系"] == studentB["科系"] #studentA跟studentB同系嗎?
studentA["入學年"] == studentB["入學年"] #studentA跟studentB同入學年嗎?

看到這裡是不是稍微有感覺了呢?你可以把判斷式可以想像成像是英文的”Is it ?“和”Isn’t it ?“;回傳的TRUEFALSE就是”Yes”和”No”,正式一點的說法就是比對物件內容是否符合描述,而其特有的回傳值TRUEFALSE在R裡面的資料類別(class)被稱為logical(environment簡寫logi),logical這個類別本身還有很多特殊之處和各種妙用,這個部分就期待大家去發現啦~

※bonus小知識:在程式語言中,各種設計大多都是有他特殊的意義的,如果是已經接觸過filter()mutate()或是summarise()這幾個function的同學則可以進階思考一下,為甚麼filter()使用的是==mutate()summarise()使用的卻是=,想必會更清楚他們的概念喔。

課後測驗:

請問下列哪一個才是正確的物件命名方式?(單選)

cat == 貓 #1
cat == "貓" #2 
cat -> "貓" #3
cat = "貓" #4

答案(反白):#4,是一個character,記得要用雙引號喔,箭頭方向如果記反了也趕快回去複習5.1.2!!


6 warning

6.1 沒有這個函數

請參考Q&A影片的library與執行順序裡library的部分。

6.2 找不到需要的package(Required package not found)

字面上的意思,把沒有的那個package下載回來就好了,例如Required package curl not found就要去下載curl這個package。
package下載方式和老師上課教的一樣。

6.3 找不到物件(Object not found)

請參考Q&A影片的library與執行順序裡執行順序的部分。
object not found就是說環境裡沒有你要的物件的意思, 像附圖上這個例子就是環境(environment)裡沒有listExample這個物件。
老師同一個大主題的例子一般都會是連續的,你可能要電子書往上回去找該物件的定義在哪裡(可以ctrl+f),把他copy回來執行。


7 電腦使用

7.1 網址與路徑

網址(website address)顧名思義為網路上的地址,一般為http://開頭,與路徑(path)的意義類似,但不同的是網址為網路上的地址、用於「居住」在網際網路上的資料,而路徑為本地資料的地址,即「居住」在自己電腦的資料,如「新北市三峽區大學路151號」之於「社會科學院4樓21室」,兩者意義類似但不可通用,就像在google map搜尋不到「社會科學院4樓21室」、社科院裡面沒有「新北市三峽區大學路151號」這個教室一樣。
想了解的更清楚的同學可以去搜尋絕對路徑相對路徑的概念。

網址(絕對路徑)

路徑(相對路徑)
以C槽為例

7.2 超出螢幕、無法點擊按鍵——螢幕縮放問題

有時因螢幕縮放比例過大會出現無法點擊或看到部分按鍵或區域的狀況,請至系統裡面找到「顯示設定」或是「顯示器」,點進去調整「縮放與版面配置」的比例。

7.3 windows系統下的中文使用者名稱

由於windows系統更改使用者名稱不易,易造成檔案受損的問題或甚至必須重灌,故建議使用創建新使用者帳戶的方式(若有必要可將原使用者帳戶之資料轉移到新使用者帳戶,但沒必要的話不建議這樣做),創建新使用者帳戶的方法請參考官網。
創建完成後的帳戶切換方法請參閱7.4

官網網址:https://support.microsoft.com/zh-tw/help/4026923/windows-10-create-a-local-user-or-administrator-account

7.5 使用者帳戶切換


8 進階版Windows亂碼問題

如果你成功跨越了Windows帶給你的種種痛苦正式開始了你的R語言征途,以下提供一些我遇到過關於windows帶給我的各種encoding問題作為參考。

如果你也遇到過稀奇古怪的問題,歡迎到1投稿分享,所有投稿刊登皆會註明提供者。

8.1 Notepad++是你的好幫手

透過Notepad++,你可以輕鬆轉換各種資料或檔案的encoding。

以資料讀取為例,有人的Windows R就是不吃BOM、有的反而是沒BOM就吐亂碼給你,這部分只能靠你自己去摸索你家Windows R的喜好了,請把他當作你喜怒無常的男女朋友哄哄他或是當作養貓的訓練找到順毛摸的辦法。

8.2 shinyapps.io

嚴格來說我不確定這問題在MAC會不會發生,但server無法顯示中文的問題可以靠將資料轉為UTF-8 without BOM解決。

相關參考資料:https://shiny.rstudio.com/articles/unicode.html

8.3 API

有時候中文資料會因為編碼導致API轉換失敗(例如ggmap或是爬蟲相關package),可以用Notepad++或enc2utf8()等方式轉換。


9 GitHub

以下教學僅提供GitHub基礎使用說明,故不另針對Git進行說明,影片具連貫性,建議依照順序觀看,新學期大學部課程已去除GitHub使用,若是該課程學生可跳過這個部分。

9.1 what is GitHub & what can it do

簡單的說,GitHub是一個儲存記錄和交流的網路平台,可以想像成fb或ig,只是我們在fb和ig記錄的是我們的生活,而GitHub記錄的是檔案的變化(包括新增檔案、改變檔案內容),而我們po文會留下記錄,GitHub在我們commit之後也會留下記錄,這也是點名的來源(想像成每次上課就要po一篇限時動態會比較有趣?)。
另外一個我們使用到的功能是fork和clone,fork就像是fb的分享,我們把老師的檔案分享過來,然後用clone把分享過來的檔案拉進自己的電腦裡使用,fork和clone更詳細的說明請看5.2的影片。
除了以上幾個之外,GitHub還具備其他如討論串、合作計畫等功能,若有興趣的同學請參考wiki

9.2 fork & clone

9.3 commit & push

9.4 GitHub沒有檢測到變動

兩個可能,

  1. 你沒存檔
  2. 你存錯地方(路徑不對)

RStudio存檔方式請參照3.2,路徑確認方式如圖,要存在路徑的那個資料夾裡面才有用,原因請參照9.1


10 課堂專區

應老師要求特別留下這個章節,不是修這堂課的同學可以直接跳過XD

10.1 Hypothes.is Chrome extension

chrome提供使用者許多可安裝的外掛/擴充程式,如gmail的追蹤、即時google翻譯等,Hypothes.is Chrome extension也是其中之一,故在使用時,請先確認是否使用chrome瀏覽器
下載後也請記得去電子書加入hypothes.is群組。

下載網址:https://chrome.google.com/webstore/detail/hypothesis-web-pdf-annota/bjfhmglciegochdpefhhlphglcehbmek?hl=zh-TW

10.2 Gitter

10.2.1 程式碼黑底

連著chunk一起複製貼上就會有黑底喔。

10.2.2 傳送圖片or截圖

螢幕截圖只要按鍵盤上的截圖快捷鍵(筆電的話一般是prt sc,在backspace的上面),然後在輸入欄右鍵貼上就可以了。
圖片檔請直接把檔案拖到輸入欄。

想知道單獨截圖特定程式畫面或是其他系統、桌機的截圖快捷鍵方式請看這裡:https://www.java.com/zh-TW/download/help/screenshot.html

10.3 Google classroom使用者名稱

在Google classroom點右上角你的頭像可以看到的名稱,它寫在email上方。 但是,如果沒設定頭貼,google會默認你的「名」是頭像,像我的默認頭像會是「靜怡」,但我實際上的使用者名稱是「李靜怡」,如果只打名字或大小寫打錯的話,在程式執行時會無法辨識你正確的名字(character比對的概念,有興趣可以自己玩看看),請同學注意。

10.4 關於如何對答案

由於參考解答和作業答案物件命名相同,導致有同學反應經常對答案會很混亂或是不小心改到其中一方,在此提供兩個老師跟我自己的做法給同學們參考。

10.4.1 把environment分開

開兩個不同的RStudio,把environment分開。

優點:不用對檔案內容做多餘的更動,不怕不小心動到內容
缺點:無法使用==來確認答案是否正確,要自己用眼睛看

10.4.2 物件取名區隔化

將物件取名做出區隔(ie. 所有答案檔的物件都在結尾加上_ans)。

優點:可以用==來快速確認答案是否正確 缺點:每個物件、資料都要分開命名;coding內容也要跟著修正,不夠細心的同學可能會漏改導致出現錯誤