8.1 幽靈(no.1~no.10)
8.1.1 R和S+的不同之處
R和S+有大量的不同之處。在R官網的FAQ板塊已經說明(http://cran.r-project.org/faqs.html)。一部分,但不是所有的,也被提及。
8.2.2 包的功能
假設你看到了一條命令然後你想試試它,比如:
fortune('dog')
你試了一下得到了以下信息:
Error: could not find function "fortune"
當然的,你會認爲你安裝的R版本是壞的。我沒有證據證明你的安裝不是壞的,但更可能的原因是你當前的R版本沒有安裝包含這個函數fortune的包。你可以試試:
require(fortune)
於是你又得到了這條信息:
Error in library(package, ...) :
there is no package called ’fortune’
這個問題是你需要安裝這個包到你的計算機上。如果你的計算機已經連接網絡,你可以運行這條命令:
install.packages(’fortune’)
在這些提示之下,你會得到:
Warning message:
package ’fortune’ is not available
現在的問題是我們寫錯了包的名字。大寫和拼寫是非常重要的。正確的命令是:
install.packages(’fortunes’)
require(fortunes)
fortune(’dog’)
包的安裝只需一次;在每一個項目中,當你需要使用某個函數是,包含這個函數的包都需要被安裝。
命令:
library()
向你展示在你的標準安裝路徑下的R包。
8.1.3 優先級
假定代碼會按照預期執行是一種罪惡。下述命令明確地準備生成從1到小於n的序列。
1:n-1
從上述示例,你應該會推斷出這不是你得到的結果。
這是一種製造相似錯誤的方法:
10^2:6
如果你執行:
-2.3 ^ 4.5
你將會得到一個令你愉快的數字。如果你執行:
x <- -2.3
x ^ 4.5
你將會得到 not-a-number,也就是NAN。當然你或許會想到這兩種方式的命令是一樣的啊,其實它們並不是-操作符優先級又一次來搗鬼了。如果你真的需要後一種方式的操作,你可以這樣做:
as.complex(x) ^ 4.5
請重視操作符優先級的問題吧。如果你不是很確定,括號可以強力執行你想要的命令。你可以查看R的優先級列表:
?Syntax
8.1.4 缺失值的相等問題
用下述命令來檢驗x中的缺失值幾乎是不可能的:
x == NA
爲什麼不呢?
這是一個小提示:
3 == c(3, 1, 3, NA)
要檢驗,用:
is.na(x)
8.1.5 檢驗NULL
同樣的,函數is.null可以檢驗一個對象是否爲NULL。
> xnull <- NULL
> xnull == NULL
logical(0)
> xnotnull <- 42
> xnotnull == NULL
logical(0)
> is.null(xnull)
[1] TRUE
然而,人們經常檢查對象的長度是否爲零來判斷—NULL並不是唯一的長度爲零的對象。
> is.null(numeric(0))
[1] FALSE
8.1.6 成員
對於8==8操作我們期望來檢查一個向量中的元素是否屬於另外一個向量。如果幸運的話你會它會工作,但是一般情況下不會。(事實上,如果你創造了一個函數並且它正常運行你將是不幸的—你將會錯過你造成的bug。)
> x1 <- 10:1
> x1 == c(4, 6)
[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
上面的命令並不能給你在x1中和4,6相等的位置。
下述情況下,使用8%in%:
> x1 %in% c(4, 6)
[1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
8.1.7 多重測試
如果你想做一個多重測試,你不能簡略。以上一節的x1爲例:
> x1 == 4 | 6
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> x1 == (4 | 6)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
接下來我們討論在這兩個命令裏邊到底發生了什麼。這對你自己去發現問題來說是一個好的經驗。
但是首先,我們實際上想要的操作是這樣的:
> x1 == 4 | x1 == 6
[1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
或者(最好是更通用的方法):
> x1 %in% c(4, 6)
[1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
現在,我們的彩蛋嘗試做了些什麼呢?
x1 == 4 | 6
和這個是等價的:
(x1 == 4) | 6
(兩個命令會得到相同的答案)。最後一個命令和下述命令相同:
6 | (x1 == 4)
既然”or”是可交換的。8|8操作會強制參數變爲邏輯值。任何非零數都會強制變爲TRUE,因此所有結果的元素都將會是TRUE因爲6已經被強制變爲TRUE.
其他的一些命令會有不同的結果但是仍然遵從相似的強制轉換。
4 | 6
和 下述命令相同:
TRUE | TRUE
最後結果即TRUE。因此R將會被問:
x1 == TRUE
在這種情況下,‘==’不會強制轉換對象爲邏輯值,而是轉換爲更加通用的類型:數值型。TRUE被強制轉換爲1。
8.1.8 強制轉化
自動強制類型轉換是一件好的事情。然而,它也會產生意外。下邊是一個強制類型轉換的列表—最具體到最不具體。
modes <- c('logical', 'numeric', 'complex', 'character')
modarr <- array(vector('list', 16), c(4, 4), list(modes, modes))
for(i in 1:4)
for(j in 1:4)
{
modarr[[i, j]] <- c(vector(modes[i], 0), vector(modes[j], 0))
}
> modarr
logical numeric complex character
logical Logical,0 Numeric,0 Complex,0 Character,0
numeric Numeric,0 Numeric,0 Complex,0 Character,0
complex Complex,0 Complex,0 Complex,0 Character,0
character Character,0 Character,0 Character,0 Character,0
這個示例並沒有將numeric的interger類型加入進來。intergers在logical和(通用)numeric之間。你極不可能去關心(甚至知道)一個對象是以interger或者更加通用的numeric類型來存儲的。
下邊是一份完整的從最具體到最不具體的自動轉換(存儲)模式。
- logical
- integer
- numeric
- complex
- character
評論:這個示例中使用的matrix是一個list。注意到在matrix中使用’[[‘,一些使用者在偶然的情況下的到這樣的matrix—一個或許會困惑你的事件。
8.1.9 強制轉換下的比較
當你在有強制類型轉換的地方做比較時,當心點:
> 50 < ’7’
[1] TRUE
8.1.10 在正確的地方放置括號
你想要將括號放置在正確的地方,下面的就是你期望的操作:
> length(mylist != 1)
Error: (list) object cannot be coerced to double
> length(mylist) != 1
[1] TRUE
在這個示例中我們是幸運地得到了一個錯誤信息所以我們就會知道有地方出問題了。