close
餵資料給函數是有一些可以讓你偷懶的小規則的,知道規則以後,就可以就隨便餵了。
 
一般函數都不須要餵太多東西,所以平常不會感覺到什麼差別,但是有些函數可能用上很多arguments,或是arguments的名字很長,那就有些偷吃步了。
 
這時候就要借助繪圖函數了,單純因為他們的arguments比較多,比較好舉例。
下面以長條圖barplot()為例,先看?barplot的Usage:
 
barplot(height, width = 1, space = NULL,
       
names.arg = NULL, legend.text = NULL, beside = FALSE,
       
horiz = FALSE, density = NULL, angle = 45,
        
col = NULL, border = par("fg"),
       
main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
       
xlim = NULL, ylim = NULL, xpd = TRUE, log = "",
       
axes = TRUE, axisnames = TRUE,
       
cex.axis = par("cex.axis"), cex.names = par("cex.axis"),
       
inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0,
        add = FALSE, args.legend = NULL, ...)
 
長條圖裡有很多東西可以改,而且這還不是全部,當一個函數最後放上 ... 的時候,就表示還有一些額外的arguments可以用。
而且是只有第一項height沒有任何預設值,其他argument都接上等號,所以這個只要第一項放入數據就能跑了。
下面借了example裡的例子。
 
> (tN <- table(Ni <- rpois(100, lambda = 5)))
> barplot(tN, col = rainbow(20))
 
example裡 rpois()是隨機產生100筆資料的函數,pois 表示Poisson分布。
然後用table整理了一下,看看0,1,2,... 各有幾個。然後就叫barplot畫圖,設定了一下顏色 col。
[統計小知識:Poisson分布是離散型變數的第二大代表。一小時內訪問某店的客人數量就是一種Poisson的資料,也是一種計數的資料。忘了離散型變數?Lesson 1提了一次,離散型變數是畫長條圖,不適合畫直方圖喔!]
 
接著xlim 是x軸範圍和xlab x軸標示,下面會以他們為例,也可以自己亂改看看:
在方向鍵上,會出現上一個輸入的指令,可以不斷往上叫回前面的指令來改就不用一直重打了。
> barplot(tN, 0.5, 0.8#no names
> barplot(width=0.5, space=0.8, height=tN) # change order
> barplot(0.5, space=0.8, height=tN)
> barplot(
w=0.5, space=0.8, tN)
> barplot(
tN, w=0.5, xlab="count", col= rainbow(10))
> barplot(
h=tN, xlim=c(0, 20), 0.5, xlab="count") #Error h
> barplot(tN, xlim=c(0, 25), 0.5, xlab="count", h=1, col= rainbow(10)) # Error h
> barplot(height=tN, xlim=c(0, 25), 0.5, h=1, col= rainbow(10)) 
不知道有沒有試出什麼心得?原則上:
省略arguments的名稱時,自動照順序讀。
有標名稱時,順序隨意。
有些有名稱有些沒名稱:有先名稱的先設定好,沒名稱的照順序排。
名稱不用給全名,但是不能有重名。例xlab 和xlim,height和horiz,只給x或xl都會失敗,因為兩個開頭都是xl,至少要給xla或xli...另外只有一個名字是w開頭,所以可以只給w。
然後就理解,為什麼越重要的arguments越前面,而且大家很習慣省略前面重要的幾項的名稱,但是後面常用的選項名稱會記得清清楚楚。
 
雖然可以不打全名,但是一般要打還是會打一個看得懂縮簡。
例如在讀資料的函數read.table或read.csv裡,這三種都很多人用:
> read.table("data.txt", header=TRUE)
> read.table("data.txt", head=TRUE)
> read.table("data.txt", TRUE)
有種越來越偷懶的感覺...不過header是第二順位,所以真的偷懶沒關係啦,大家都看得懂!(header是在設定第一列是不是欄位名。) 嗯…還有一個最偷懶的:
> read.table("data.txt, T)
 
還有一些情況,想不打argument的名字都不行。先看看你在R裡存了什麼東西,然後用rm清空你存的所有物件,然後就什麼都沒了。

> ls()

> rm(list=ls())

> ls()

 
再來不知道有沒有人注意:長條圖有超過10個bar,但是我只給10個顏色,他又從第一個顏色開始輪,這種自動補滿的功能,R裡隨處可見。
> matrix(0, ncol=10)
> matrix(1:3, nrow=2, ncol=10) # warning
> array(
1:3, dim=c(2, 10)) # no warning
> cbind(1, 1:5)
這種補滿常常沒有提醒的,所以有時候要小心,資料長度有沒有放錯,因為會偷偷補滿。
 
小結:
function在理解你的input的時候,有名字的先排名字,沒名字照順序排。名字不用是全名,但是必須對應的上獨特的arguemnts. 請至少打成自己方便看懂的形式。
arrow
arrow
    創作者介紹
    創作者 霹靂貓 的頭像
    霹靂貓

    生活統計二三事

    霹靂貓 發表在 痞客邦 留言(0) 人氣()