本文我们学习如何使用 R中的do.call & call 函数
语法说明
首先我们看看两个函数的语法:
do.call 函数执行一个函数,参数包括被执行函数的名称以及list参数指定被执行函数的参数。
do.call("any_function", arguments_list) # Basic R syntax of do.call function
call 函数创建一个可以执行的函数对象,用于后续执行。
call("any_function", argument1, argument2) # Basic R syntax of call function
下面通过几个示例来说明如何使用这两个函数。
do.call()的基本使用
下面示例展示如何通过函数名称执行该函数。首先准备一些示例数据:
x1 <- 1:10
x1
# [1] 1 2 3 4 5 6 7 8 9 10
x1 变量的包括的数据从1到10,我们现在要求x1变量所有元素之和。假设我们仅求和函数的名称(如:sum),则可以使用do.call函数执行:
do.call("sum", list(x1))
# 55
sum(x1)
# 55
注意,sum参数必须在list中指定,因为do.call函数仅能通过list指定被执行函数的参数列表。上面两种方式执行结果一致。通过do.call可以实现动态逻辑,下面再看一个带多个参数的示例。
do.call带多个参数
首先我们修改示例数据,增加一个NA元素:
x2 <- c(x1, NA)
x2
# [1] 1 2 3 4 5 6 7 8 9 10 NA
x2包括了缺失值,如果现在执行上面示例的代码,会输出NA:
do.call("sum", list(x2))
# [1] NA
我们知道sum函数可以执行另一个参数na.rm,删除缺失值求和。这样我们通过list增加参数:
do.call("sum", list(x2, na.rm=TRUE))
# [1] 55
sum(x2, na.rm = TRUE)
# [1] 55
正常执行,且两个结果一致。下面我们看看call函数如何使用。
call 函数
与do.call函数相关的是call函数。假设我们需要实现示例2的功能,示例代码:
my_call <- call("sum", x2, na.rm = TRUE)
my_call
# sum(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, NA), na.rm = TRUE)
前面代码我们通过call函数创建了一个对象,现在使用eval函数执行该对象:
eval(my_call)
# [1] 55
结果一致。当这些函数与for-loops
, while-loops
或自定义函数代码组合时,能够实现非常强大的功能。因此,这些学习这些函数非常有意义。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/122397987