R語言封裝函數
原帖見豆瓣:https://www.douban.com/note/279077707/
一個完整的R函數,需要包括函數名稱,函數聲明,函數參數以及函數體幾部分。
1. 函數名稱,即要編寫的函數名稱,這一名稱就作為將來調用R函數的依據。
2. 函數聲明,函數名稱 <- function, 即聲明該對象的類型為函數。
3. 函數參數,這里是輸入的數據,函數參數是一個虛擬出來的一個對象。函數參數所等於的數據,就是在函數體內部將要處理的值,或者對應的數據類型。 函數體內部的程序語句進行數據處理,就是對參數的值進行處理 ,這種處理只在調用函數的時候才會發生。函數的參數可以有多種類型。R help的界面對每個函數,及其參數的意義及所需的數據類型都進行了說明。
4.函數體
運算過程
R運算過程中,應該盡量減少循環的使用,特別是嵌套循環。R提供了 apply,replicate等一系列函數,來代替循環,應該盡量應用這些函數, 提高效率。 如果在R中實在太慢,那么核心部分只能依靠C或者Fortran 等語言編寫,然后再用R調用這些編譯好的模塊,達到更高的效率。
運算過程中,需要大量用到if等條件作為判別的標准。if和while都是需要數據TRUE/FALSE這樣的邏輯類型變量,這就意味着,if內部,往往是對條件的判別,例如 is.na, is.matrix, is.numeric等等,或者對大小的比較,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,則花括號可以省略,否則就必須要將所有的語句都放在花括號中。這和循環是一致的。
例子1
## if與條件判斷
fun.test <- function(a, b, method = "add"){
if(method == "add") { ## 如果if或者for/while;
res <- a + b ## 等后面的語句只有一行,則無需使用花括號。
}
if(method == "subtract"){
res <- a - b
}
return(res) ## 返回值
}
### 檢驗結果
fun.test(a = 10, b = 8, method = "add")
fun.test(a = 10, b = 8, method = "substract")
for循環有些時候是必須要用到的,for循環內部,往往需要用下標,訪問數據內的一定元素,例如向量內的元素,這時候用方括號表示。一維的數據組合,或者數組,常常稱為向量。二維的數據組合,往往稱為矩陣,或者數據框。具體的訪問方式主要是方括號內部有沒有逗號的區別。for循環或者while循環有時候讓人覺得比較困惑,可能需要專門的時間進行講解。
例2
### for循環與算法
test.sum <- function(x)
{
res <- 0 ### 設置初始值,在第一次循環的時候使用
for(i in 1:length(x)){
res <- res + x[i] ## 這部分是算法的核心,
##總是總右面開始計算,結果存到左邊的對象
}
return(res)
}
### 檢驗函數
a <- c(1,2,1,6,1,8,9,8)
test.sum(a)
sum(a)
對於 博客中ggplot2的代碼
可如下進行封裝:
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') }
調用如下:
data <- head(df_CJT_USA, 10) xname <- 'CurrentJobTitleSelect' yname <- 'Count' fun1(data, reorder(data$CurrentJobTitleSelect, data$Count), data$Count, xname, yname)