學習R之函式和作用域

2021-10-22 02:52:44 字數 3044 閱讀 7216

鍵入乙個函式的名稱,將顯示其執行的**,以下是 rt 函式,該函式將生成基於 t 分布的隨機數:

rt

>

>

function

(n, df, ncp)

>

>

rt 函式需要傳入三個引數:n 是要產生的隨機數的數目,df 是自由度值,ncp 是乙個可選的非中心引數。

在 r 中,函式中計算的最後乙個值將自動返回,並不需要顯式地使用 return 關鍵字宣告應該從函式返回哪個值。

建立自定義函式時,只需像其他任何變數一樣為函式賦值,如建立乙個函式來計算直角三角形斜邊的長度:

# hypotenuse 是建立的函式,x 和 y 是它的引數,在大括號中的內容是函式體

hypotenuse <-

function

(x, y)

hypotenuse(3,

4)>

>[1

]5hypotenuse(y =

24, x =7)

>

>[1

]25

函式形參的預設值不僅僅是常數值,還可以把任何 r **放進去,甚至使用其他形參。

# 引數 m 和 s 是第乙個引數的平均值和標準差

normalize <-

function

(x, m = mean(x)

, s = sd(x)

)(normalized <- normalize(c(1,

3,6,

10,15)

))>

>[1

]-1.0690450

-0.7126966

-0.1781742

0.5345225

1.4253933

mean(normalized)

>

>[1

]-5.572799e-18

sd(normalized)

>

>[1

]1# mean 和 sd 都是 na

normalize(c(1,

3,6,

10,na)

)>

>[1

]nanana

nana

# mean 和 sd 都有乙個引數 na.rm,能刪除計算之前的任何缺失值

normalize <-

function

(x, m = mean(x, na.rm = na.rm)

, s = sd(x, na.rm = na.rm)

, na.rm =

false

)(normalize(c(1,

3,6,

10,na)

, na.rm =

true))

>

>[1

]-1.0215078

-0.5107539

0.2553770

1.2768848

na

函式可以像其他變數型別一樣地使用,可將之作為其他函式的引數,並且從函式中返回。

乙個常見的,把其他函式當成引數的函式是 do.call。此函式提供了一種呼叫其他函式的替代語法,讓我們可以像列表一樣傳遞引數,而不是逐次傳遞。

# 和 hypotenuse(3, 4) 等價

do.call(hypotenuse, list(x =

3, y =4)

)>

>[1

]5# 和 rbind(dfr1, dfr2, dfr3) 等價

dfr1 <- data.frame(x =1:

5, y = rt(5,

1))dfr2 <- data.frame(x =6:

10, y = rf(5,

1,1)

)dfr3 <- data.frame(x =11:

15, y = rbeta(5,

1,1)

)do.call(rbind, list(dfr1, dfr2, dfr3)

)>

> x y

>

>11

1.17915584

>

>22

-2.25116142

>

>33

-0.57103585

>

>44

0.38327699

>

>55

1.08917610

>

>66

0.08678987

>

>77

0.03691078

>

>88

3.17112747

>

>99

1.71188999

>

>

1010

0.02813865

>

>

1111

0.94765173

>

>

1212

0.53830002

>

>

1313

0.21092560

>

>

1414

0.84087300

>

>

1515

0.43478595

變數的作用域是指變數可見的範圍,如在函式內部定義乙個變數時,該函式中下面的語句將能訪問到該變數。

# g 是 f 的子函式,即使沒有在 g 裡定義 y,也能訪問 f 中定義的 y

f <-

function

(x) g(x)

}f(sqrt(5)

)>

>[1

]1.618034

r 會在當前的環境下尋找變數,如果找不到,則會繼續在父環境中搜尋,然後再在該環境的父環境中搜尋,以此類推,直到達到全域性環境,在全域性環境 中定義的變數在任何地方都可見。

函式作用域和作用域鏈

所謂作用域就是 變數在宣告它們的函式體以及這個函式體巢狀的任意函式體內都是有定義的。function scope while 1 function console.log foo,global a,i m if b,i m while c c is not defined scope 但是,在js中...

Js 函式作用域和塊作用域

你不知道的js 第二版上捲第三章筆記 全域性作用域 定義在函式外部的變數,函式內部可以呼叫 區域性作用域 定義在函式內部的變數,函式外部不可以呼叫 塊級作用域 如同下面這個例子 for var i 1 i 10 i console.log i,b 輸出的還是 10 100!說明js沒有塊級作用域當我...

R語言變數作用域

語言採用的是lexical scoping 詞法作用域 詞法作用域,又稱靜態作用域,即變數定義後的作用域是不變的。在函式的主體裡面,變數是分為被約束的 區域性的 或自由的三種。被約束的變數是指匹配函式形式引數的變數。區域性變數是指,在函式主題內建立和定義的變數。自由變數指的是那些既不是 區域性也不是...