說明:#代表注釋,##代表執行結果。
函式最大的優點是**復用,模組化設計。也就是說如果這一段**塊需要在多處使用,就應將其寫成乙個函式,多次呼叫,有效的規避了**的重複。並且在修改時只需要修改函式即可。在定義函式時,個人建議將一小段**封裝成乙個函式,使得**可讀性更高,並且能夠降低程式的複雜性。
函式名
乙個自定義r 函式由三個部分組成:
可以通過body(),formals(),environment()函式分別得到函式的三部分。
函式體是乙個或多個表示式的組合,如果函式體中沒有return()函式返回值,則預設返回最後乙個表示式為返回值。假如你需要返回多個結果,則可以嘗試用list列表的形式返回,之後再進行unlist等操作。
函式在r 語言中與其他普通數值型物件、字元型物件有相同的地位,這也就意味著函式可以擁有屬性。
# 定義乙個求和函式
mysum
function
(x,y)
# 或者
mysum
function
(x,y) x+y # 因為函式只有乙個表示式,大括號可省略
mysum(1:
2,3:
6)## [1] 4 6 6 8
# 如果呼叫函式的形參、實參對應關係儲存在列表中,可以用函式do.call() 來表示函式呼叫
do.call(mysum,list(1:
2,2:
3))## [1] 3 5
#得到函式組成
body(mysum)
##formals(mysum)
## $x
## $y
## [1] 1
environment(mysum)
##
由於r推崇的是向量化的程式設計,所以形參可以為向量。當x,y長度不相等時,會迴圈長度短的向量,進而求和。如果你定義的函式不支援向量化的實參,別擔心,r語言提供了vectorize函式解決這一問題。
g
function
(x)elsey}
** **(c(-2
,-0.5,0,
0.5,1,
1.5)
)## [1] 1.00 0.25 0.00 0.25 1.00 1.00
下面再簡單定義乙個繪圖函式
myplot
function()
myplot(
)
即使函式沒有引數,也不能去掉括號引用函式。
windows系統下,rstudio可以手動儲存為pdf,方便調節圖形尺寸,便於圖形美觀。
指定預設值
函式定義時有預設值的形式引數在呼叫時可以省略對應的實參,省略時取預設值。
mysum
function
(x,y=1)
mysum(1:
2)## [1] 2 3
字首形式:如mysum(1:2)
中綴形式:如5-2,或者是』-』(5,2)。因為它不是合法的r函式名。
替換形式:對屬性進行修改,如通過colnames()函式賦值修改資料框或矩陣等列名。
特殊形式:比如x[1],x[[1]],for,if,(),{}等,這些函式都可稱為初等函式,使用者是無法訪問其三部分的。
x
2`[`(x,1)
x[1]# 與上一條命令結果相同
## [1] 1
`[10)
# 與x[1]
## [1] 10 2
r遞迴實現斐波那契數列:
# 參考李東風書籍
fib1
function
(n)}
for(i in0:
5) cat(
"i ="
, i,
" x[i] ="
, fib1(i)
,"\n"
)## i = 0 x[i] = 0
## i = 1 x[i] = 1
## i = 2 x[i] = 1
## i = 3 x[i] = 2
## i = 4 x[i] = 3
## i = 5 x[i] = 5
r語言中的變數是指向r物件的引用,在較簡單的函式定義中大體上可以將r 變數看成是對應的儲存空間,這一點與一般的計算機語言是有區別的。
# 定義函式fun1
fun1
function()
fun1(
)## [1] 123
print(x)
## error in print(x) : 找不到物件'x'
那麼如果r工作空間中已經存在同名的變數,會不會有影響?
fun1
function()
fun1(
)## [1] 123
x 2,3)
print(x)
## [1] 1 2 3
從上述小例子中可以發現,在函式中定義x時會變成區域性變數,這種規則在r中稱為掩藏。也就是函式本身是另乙個工作空間。
那麼想在函式中修改r全域性環境中的變數怎麼辦??
x
2,3)
fun1
function()
fun1(
)## [1] 123
print(x)
## [1] 123
<
[1] 《r 語言教程》李東風著
R語言 編寫自定義函式
r語言實際上是函式的集合,使用者可以使用base,stats等包中的基本函式,也可以編寫自定義函式完成一定的功能 乙個函式的結構大致如下所示 myfunction function arglist 其中,myfunction為函式名稱,arglist為函式中的引數列表,大括號 內的語句為函式體,函式...
R語言 自定義排序
我有乙個類似於以下內容的分類資料集 a data.frame animal c cat cat cat dog dog dog elephant elephant elephant color c rep c blue red green 3 我想訂購它,以便動物用狗,然後大象,然後貓,然後顏色分為...
自定義函式 Excel之自定義函式
在excel中,當系統函式不能滿足我們的需求時候,我們可以使用vba自定義函式,如抓取網頁資料,翻譯詞彙,手機號歸屬地查詢等。下面將介紹2個自定義函式,idymd函式 身份證年月日性別 通過身份證號,返回性別,出生年月日。語法 idymd id 引數 id,身份證號,預設身份證長度18位。vba 如...