base | switch和do.call函数的用法

本文详细介绍了R语言中的switch()函数,演示了如何根据输入选择并执行不同操作,同时剖析了do.call()和call()函数在函数调用中的实用技巧,通过实例展示如何灵活运用这些工具进行数据处理和自定义函数构建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇来介绍三个基础包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")
8fe152a3156561a5b058f86eeba4a361.png

再配合向量化运算:

par(mfrow = c(1,3))
lapply(c("disp", "drat", "wt"), FUN = "fplot")
086007138ce303d97a48c2693461b243.png

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()
0a1c9d8c7d063e4074d3e02672ee54b8.png
59b1c6e3c58fd10f2301b74c3f7f5b2b.jpeg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值