R 程式設計/函式的使用
外觀
< R 程式設計
- 您可以在控制檯中輸入函式名稱,函式名稱後面不帶括號。這將在控制檯中列印函式的程式碼。
- 您也可以使用
page()函式,它將開啟一個新的編輯器視窗並在該編輯器中列印函式的程式碼。 - 您也可以使用TinnR包中的
trCopy()函式來複制函式的程式碼。然後您只需將其貼上到文字編輯器中即可檢視它。
以下是使用lm()函式的示例。
> lm
> page(lm)
> library(TinnR)
> trCopy(lm)
> fn <- function(){
+ print("hello")
+ }
> fn()
[1] "hello"
預設情況下,將返回最後一行(*)的值。在下面的示例中,我們有一個包含兩個物件的簡單函式。返回最後一個物件。
> test <- function() {
+ x <-1
+ z <- 2
+ }
> res <- test()
> res
[1] 2
函式可以使用以下方法顯式返回值return()(但由於它是最後一行,您可以簡單地使用x代替)
> test <- function() {
+ x <- 1
+ z <- 2
+ return(x)
+ }
> res <- test()
> res
[1] 1
- ) 更準確地說,它不是“最後一行”,而是最後一次計算的值從函式返回。
可以新增引數。
square <- function(x){
x2 <- x^2
return(x2)
}
square(x = 2)
請注意,上面的函式最好寫成(更有效率)
square <- function(x) x^2
(因為最後的值會被返回)
... 引數意味著您可以新增其他引數,這些引數將傳遞給函式內部的函式。
plot2 <- function(x,...){
plot(x, type = "l", ...)
}
plot2(runif(100), main = "line plot", col = "red")
可以將資料框新增為引數[1]。以下是一個示例
redplot <- function(z, y, data, env=parent.frame()) {
if(!missing(data)){
z <- data[,deparse(substitute(z))]
y <- data[,deparse(substitute(y))]
}
plot(z,y, col = "red", pch = 15)
}
mydat <- data.frame(vm = rnorm(10),output = rnorm(10))
redplot(vm,output,data=mydat)
對於估計命令,可以將公式新增為引數。例如,我們可以使用公式介面建立自己的普通最小二乘函式。
ols <- function(formula, data = list()) {
mf <- model.frame(formula=formula, data=data)
X <- model.matrix(attr(mf, "terms"), data=mf)
y <- model.response(mf)
beta <- solve(t(X)%*%X)%*%t(X)%*%y
se <- sqrt( 1/(nrow(X) - ncol(X)) * sum((y - X%*%beta)^2) * diag(solve(t(X)%*%X)))
res <- cbind(beta,se)
colnames(res) <- c("Coefficients","Standard errors")
res
}
N <- 100
u <- rnorm(N)
x <- rnorm(N) + 1
y <- 1 + x + u
ols(y~x)
> fib <- function(n) {
if(n > 2) {
m <- fib(n-1)
c(m, sum(tail(m, 2)))
}
else rep(1, n)
}
> fib(30)
[1] 1 1 2 3 5 8 13 21 34 55
[11] 89 144 233 377 610 987 1597 2584 4181 6765
[21] 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040
R 函式可以被視為物件
> a <- function(n) function(a) runif(a)
> b <- a(1)
> b(10)
[1] 0.8726873 0.9512367 0.5971435 0.5540743 0.6378967 0.4030071 0.2750673 0.1777123 0.6960378 0.3969920
當想要建立許多不同型別的函式時,這將非常有用
> a <- list()
> b <- function(i){ i; function() runif(i)}
> for (i in 1:10) a[[i]] <- b(i)
> a[[1]]()
[1] 0.2617396
> a[[2]]()
[1] 0.8822248 0.3374574
> a[[3]]()
[1] 0.0348156 0.4212788 0.6107646
您可以在R中使用高階函式。與普遍看法相反,使用它們而不是迴圈並不更快,因為 apply 函式在其定義內部有一個 for 迴圈。僅在需要提高程式碼清晰度時使用它們。[2]
apply 是 R 的對映函式中最基本的一個。lapply、sapply 和 mapply 是 apply 的方便介面,分別用於列表、向量和多個向量。
apply 以陣列、要對映的維度的向量和函式作為引數。以下示例基於 apply 文件。它使用 apply 計算矩陣的列和行總和。
x <- matrix(round(rnorm(100)),10,10)
col.sums <- apply(x, 2, sum)
row.sums <- apply(x, 1, sum)
tapply 與 apply 相似,但它將函式應用於不規則陣列的每個單元格,即應用於由某些因子的級別唯一組合給出的每個(非空)值組。
> x1 <- rnorm(10)
> x2 <- sample(1:2, 10, replace = T)
> cbind(x1,x2)
x1 x2
[1,] -1.7905021 1
[2,] 1.2908169 2
[3,] -2.1902513 2
[4,] 0.4845488 1
[5,] 0.2281593 1
[6,] 0.2201302 1
[7,] 2.1574243 1
[8,] 0.5789705 2
[9,] 1.3315188 1
[10,] -1.0029822 2
> tapply(x1, x2, sum)
1 2
2.631279 -1.323446
Reduce 文件中的此函式累加地新增
> cadd <- function(x) Reduce("+", x, accumulate = TRUE)
> cadd(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
- ↑ http://r.789695.n4.nabble.com/Optional-data-argument-for-a-function-tp850247p850247.html
- ↑ Patrick Burns, The R Inferno, p. 24
