原帖見豆瓣:https://www.douban.com/note/279077707/算法
一個完整的R函數,須要包括函數名稱,函數聲明,函數參數以及函數體幾部分。數組
1. 函數名稱,即要編寫的函數名稱,這一名稱就做爲未來調用R函數的依據。
2. 函數聲明,函數名稱 <- function, 即聲明該對象的類型爲函數。
3. 函數參數,這裏是輸入的數據,函數參數是一個虛擬出來的一個對象。函數參數所等於的數據,就是在函數體內部將要處理的值,或者對應的數據類型。 函數體內部的程序語句進行數據處理,就是對參數的值進行處理 ,這種處理只在調用函數的時候纔會發生。函數的參數能夠有多種類型。R help的界面對每一個函數,及其參數的意義及所需的數據類型都進行了說明。app
4.函數體ide
運算過程函數
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行,則花括號能夠省略,不然就必需要將全部的語句都放在花括號中。這和循環是一致的。spa
例子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)code
對於 博客中ggplot2的代碼對象
可以下進行封裝:blog
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') }
調用以下:ip
data <- head(df_CJT_USA, 10) xname <- 'CurrentJobTitleSelect' yname <- 'Count' fun1(data, reorder(data$CurrentJobTitleSelect, data$Count), data$Count, xname, yname)