R代碼書寫系列:
變量名:表示變量的名字蠢护;
波浪號(~):用來連接公式中的響應(yīng)變量(波浪號左邊)和自變量(波浪號右邊);
加號(+):用來表示變量之間的線性關(guān)系灌侣;
0:當(dāng)公式中加入0治专,意味著模型中沒有截距卖陵;
如:y~u+w+v+0豎線(|):用來指定條件變量(常用在lattice繪圖公式中);
變量保護(hù)函數(shù)(I( )):放在 I 內(nèi)的表達(dá)式按照算術(shù)意義進(jìn)行解釋张峰;
a+b 表示變量a和變量b都包含在公式中
I(a+b)表示 a+b 這個和應(yīng)該包含在公式中星號(*):表示變量之間的交互效應(yīng)泪蔫;
如:y~(u+v)*w 等價于 y~u+v+w+I(u*w)+I(v*w)插入符(^):表示冪;
如:y~(u+w)^ 2 等價于 y~(u+w)*(u+w)變量的函數(shù):意味著指定變量的函數(shù)應(yīng)當(dāng)作為自變量包含在公式中喘批;
如:y~log(u)+sin(v)+w公式中可能包含的一些其他項目也具有特殊左右撩荣,例如,可傳遞給gam(廣義可加模型)的公式中表示平滑樣條的s( )函數(shù)等饶深。
點號(.):
R中的 . 符號只是個普通字符餐曹,可以在符號名稱中出現(xiàn),下面幾種情況中 . 具有特殊含義:
1) 一個 environment 中以 . 開頭的變量默認(rèn)被當(dāng)作隱藏變量敌厘,用 ls.str() 不會被列出來台猴,除非 ls.str(all.names = TRUE) .
2) 一些函數(shù)中 . 具有特殊的意義,比如線性模型函數(shù) lm() 的 formula 參數(shù)中的 . 符號會被特殊解讀俱两,比如 lm(mpg ~ ., data = mtcars) 中 mpg ~ . 這個formula會被lm()解讀成在mtcars數(shù)據(jù)表中以mpg為被解釋變量饱狂,其他列為解釋變量做線性回歸模型,在變量很多的情況下可以簡化代碼锋华,但風(fēng)險是數(shù)據(jù)列變化時回歸方程也跟著變嗡官,有些類似于SQL中使用 select * 的風(fēng)險。
3) 不同的函數(shù)可能讓 . 擁有不同的含義毯焕,比如dplyr::do()函數(shù)中的 . 就是指每個數(shù)據(jù)行衍腥,而magrittr::%>%右側(cè)函數(shù)參數(shù)中出現(xiàn)的 . 是指符號左邊的對象磺樱,pipeR::%>>%右側(cè)表達(dá)式中的 . 是指符號左邊的對象,rlist::list.map() 函數(shù) expr 參數(shù)中的 . 被解讀成 implicit lambda expression婆咸,表示需要映射的list中的每個元素本身竹捉。
4) 此外,符號被專門用來實現(xiàn)R中一個比較簡單的面向?qū)ο笙到y(tǒng)S3的method dispatch尚骄,即可以用UseMethod()定義一個方法xyz块差,那么xyz.class這指xyz方法對于class類型的實現(xiàn)。這種S3[面向?qū)ο笙到y(tǒng)比較簡單倔丈,也容易發(fā)生混淆憨闰,比如head.data.frame實際上是head對于data.frame類型的實現(xiàn),但也可以定義head.data方法需五,然后定義一種frame類型鹉动,這樣在代碼中就會發(fā)生混淆。