R语言封装函数
R語言封裝函數(shù)
原帖見豆瓣:https://www.douban.com/note/279077707/
?
一個(gè)完整的R函數(shù),需要包括函數(shù)名稱,函數(shù)聲明,函數(shù)參數(shù)以及函數(shù)體幾部分。
1. 函數(shù)名稱,即要編寫的函數(shù)名稱,這一名稱就作為將來調(diào)用R函數(shù)的依據(jù)。
2. 函數(shù)聲明,函數(shù)名稱 <- function, 即聲明該對(duì)象的類型為函數(shù)。
3. 函數(shù)參數(shù),這里是輸入的數(shù)據(jù),函數(shù)參數(shù)是一個(gè)虛擬出來的一個(gè)對(duì)象。函數(shù)參數(shù)所等于的數(shù)據(jù),就是在函數(shù)體內(nèi)部將要處理的值,或者對(duì)應(yīng)的數(shù)據(jù)類型。 函數(shù)體內(nèi)部的程序語句進(jìn)行數(shù)據(jù)處理,就是對(duì)參數(shù)的值進(jìn)行處理 ,這種處理只在調(diào)用函數(shù)的時(shí)候才會(huì)發(fā)生。函數(shù)的參數(shù)可以有多種類型。R help的界面對(duì)每個(gè)函數(shù),及其參數(shù)的意義及所需的數(shù)據(jù)類型都進(jìn)行了說明。
4.函數(shù)體
運(yùn)算過程
R運(yùn)算過程中,應(yīng)該盡量減少循環(huán)的使用,特別是嵌套循環(huán)。R提供了 apply,replicate等一系列函數(shù),來代替循環(huán),應(yīng)該盡量應(yīng)用這些函數(shù), 提高效率。 如果在R中實(shí)在太慢,那么核心部分只能依靠C或者Fortran 等語言編寫,然后再用R調(diào)用這些編譯好的模塊,達(dá)到更高的效率。
運(yùn)算過程中,需要大量用到if等條件作為判別的標(biāo)準(zhǔn)。if和while都是需要數(shù)據(jù)TRUE/FALSE這樣的邏輯類型變量,這就意味著,if內(nèi)部,往往是對(duì)條件的判別,例如 is.na, is.matrix, is.numeric等等,或者對(duì)大小的比較,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,則花括號(hào)可以省略,否則就必須要將所有的語句都放在花括號(hào)中。這和循環(huán)是一致的。
例子1
## if與條件判斷
fun.test <- function(a, b, method = "add"){
????if(method == "add") { ## 如果if或者for/while;
????????res <- a + b ## 等后面的語句只有一行,則無需使用花括號(hào)。
}
????if(method == "subtract"){
????????res <- a - b
????}
????return(res) ## 返回值
}
### 檢驗(yàn)結(jié)果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")
?
for循環(huán)有些時(shí)候是必須要用到的,for循環(huán)內(nèi)部,往往需要用下標(biāo),訪問數(shù)據(jù)內(nèi)的一定元素,例如向量?jī)?nèi)的元素,這時(shí)候用方括號(hào)表示。一維的數(shù)據(jù)組合,或者數(shù)組,常常稱為向量。二維的數(shù)據(jù)組合,往往稱為矩陣,或者數(shù)據(jù)框。具體的訪問方式主要是方括號(hào)內(nèi)部有沒有逗號(hào)的區(qū)別。for循環(huán)或者while循環(huán)有時(shí)候讓人覺得比較困惑,可能需要專門的時(shí)間進(jìn)行講解。
例2
### for循環(huán)與算法
test.sum <- function(x)
{
????res <- 0 ### 設(shè)置初始值,在第一次循環(huán)的時(shí)候使用
????for(i in 1:length(x)){
????????res <- res + x[i] ## 這部分是算法的核心,
##總是總右面開始計(jì)算,結(jié)果存到左邊的對(duì)象
????}
????return(res)
}
?
### 檢驗(yàn)函數(shù)
a <- c(1,2,1,6,1,8,9,8)
test.sum(a)
sum(a)
?
對(duì)于 博客中g(shù)gplot2的代碼
可如下進(jìn)行封裝:
fun1 <- function(data, xlab, ylab, xname, yname) {ggplot(data, aes(xlab, ylab)) + geom_bar(aes(fill = xlab), stat = 'identity') + labs(x = xname, y = yname) +geom_text(aes(label = ylab), hjust = 1.5, colour = 'white') +coord_flip() +theme_minimal() +theme(legend.position = 'none') }調(diào)用如下:
data <- head(df_CJT_USA, 10) xname <- 'CurrentJobTitleSelect' yname <- 'Count' fun1(data, reorder(data$CurrentJobTitleSelect, data$Count), data$Count, xname, yname)?
轉(zhuǎn)載于:https://www.cnblogs.com/Grayling/p/11190313.html
總結(jié)
- 上一篇: CSS样式元素
- 下一篇: 深入理解java虚拟机---读书笔记