背景
将一个函数作为参数传递给另一个函数。该问题涉及到:
- 获取该函数的名称,并以字符串形式方便后续操作
- 定位该函数所在的程序包以进行调用
- 理解
::
和:::
的调用方式
示例
函数fun_tst
在变量x上执行函数FUN
:
fun_tst <- function(x = 1:100, FUN = mean) {
return(FUN(x))
}
mean
fun_tst()
# [1] 50.5
sum
fun_tst(x = 1:1e3, FUN = sum)
# [1] 500500
问题
fun_tst <- function(x = 1:100, FUN = mean) {
msg <- paste("Executing function", FUN)
print(msg)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
在执行paste("Executing function", FUN)时出错:无法将类型“builtin”强制转换为类型“字符”的向量
尝试
1)
有趣的是,print
可以处理FUN
对象,但结果会返回函数体。
fun_tst <- function(x = 1:100, FUN = mean) {
print(FUN)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
函数(...,na.rm = FALSE).Primitive("sum") [1] 500500
2)substitute
fun_tst <- function(x = 1:100, FUN = mean) {
fun_name <- substitute(FUN)
msg <- paste("Executing function", fun_name, collapse = " ")
print(msg)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
>> fun_tst(x = 1:1e3, FUN = sum)
[1] "Executing function sum"
[1] 500500
接近成功,但是当与::
一起使用时,它看起来像一团糟:
>> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
[1] "Executing function :: Executing function dplyr Executing function glimpse"
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ..
期望的结果
fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
# Executing function glimpse from package dplyr
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
fun_tst(x = 1:1e3, FUN = sum)
# Executing function sum from package base
eval
和parse
调用函数。 - Frank