本篇来介绍三个基础包base
中的函数:switch()
、do.call()
、call()
。
1 switch()
函数
switch()
函数的功能是从给定的一些元素中选择一个,类似于“开关”。它的第一个参数表示选定的元素,后面的参数用于列举供选择的元素。
switch(1, "A", "B", "C")
## [1] "A"
switch(2, "A", "B", "C")
## [1] "B"
switch(3, "A", "B", "C")
## [1] "C"
如果列举的元素是有名称的,也可以使用它们名称进行选择:
switch("A", A = 1, B = 2, C = 3)
## [1] 1
switch("B", A = 1, B = 2, C = 3)
## [1] 2
switch("C", A = 1, B = 2, C = 3)
## [1] 3
把switch()
函数放到自定义函数中(来自函数帮助文档):
centre <- function(x, type) {
switch(type,
mean = mean(x),
median = median(x),
trimmed = mean(x, trim = 0.1))
}
set.seed(0807)
x <- rnorm(10)
centre(x, "mean")
## [1] -0.3962286
centre(x, "median")
## [1] -0.2455241
centre(x, "trimmed")
## [1] -0.4570967
2 *call()
函数
2.1 do.call()
函数
do.call()
函数用来执行函数,它的语法结构如下:
do.call(what, args, quote = FALSE,
envir = parent.frame())
what
是字符串形式的函数名;args
是一个列表,用来存储前面函数的参数值,可以通过参数名指定,没有参数名时按参数顺序指定。
使用do.call()
函数重复上节的示例:
set.seed(0807)
x <- rnorm(10)
do.call("mean", list(x))
## [1] -0.3962286
do.call("median", list(x))
## [1] -0.2455241
do.call("mean", list(x, trim = 0.1))
## [1] -0.4570967
do.call("rnorm", list(n = 5, sd = 1:5))
## [1] 0.9554680 -0.6223416 1.2728132 -4.5523222 -0.5400736
把switch()
和do.call()
函数结合起来使用:
data("mtcars")
fplot <- function(var) {
args = switch(var,
disp = list(xlab = "disp", col = "#7090B8"),
drat = list(xlab = "drat", col = "#85A5CC"),
wt = list(xlab = "wt", col = "#8DB1D1"))
args = c(formula = mpg ~ get(var),
list(data = mtcars),
pch = 19,
args)
do.call("plot", args)
}
fplot("disp")

再配合向量化运算:
par(mfrow = c(1,3))
lapply(c("disp", "drat", "wt"), FUN = "fplot")

2.2 call()
函数
call()
函数的用法与do.call()
类似,但它不会编译程序,只是把对应的程序语句输出出来。
call("mean", 1:5)
## mean(1:5)
这里输出的结果并不是字符串,而是一种特殊的call
类型。如果需要编译程序,需要使用eval()
函数:
library(dplyr)
call("mean", 1:5) %>%
eval()
## [1] 3
用于上小节定义的函数:
call("fplot", "disp") %>%
eval()

