R 获取作为参数传递给函数的函数名 背景
函数作为参数传递给函数。问题涉及:R 获取作为参数传递给函数的函数名 背景,r,function,functional-programming,namespaces,substitution,R,Function,Functional Programming,Namespaces,Substitution,函数作为参数传递给函数。问题涉及: 将该函数的名称作为字符串获取,以便于后续操作 在从中调用的包中查找该函数 理解::和::调用 例子 函数fun\u tst在x上执行函数fun: fun_tst <- function(x = 1:100, FUN = mean) { return(FUN(x)) } sum 问题 函数(…,na.rm=FALSE).Primitive(“sum”)[1]500500 2) substitute 预期结果 第二次尝试(使用substitut
- 将该函数的名称作为字符串获取,以便于后续操作
- 在从中调用的包中查找该函数
- 理解
和::
调用::
fun\u tst
在x上执行函数fun
:
fun_tst <- function(x = 1:100, FUN = mean) {
return(FUN(x))
}
sum
问题
函数(…,na.rm=FALSE).Primitive(“sum”)[1]500500
2) substitute
预期结果
第二次尝试(使用
substitute
)就快成功了。问题来自R将语言
对象转换为字符的方式:
> as.character(substitute(dplyr::glimpse))
[1] "::" "dplyr" "glimpse"
有鉴于此,粘贴
会以这种方式破坏它,这并不奇怪。我将通过分别处理这两个案例来解决这一问题:
fun_tst <- function(x = 1:100, FUN = mean) {
fun_name <- substitute(FUN)
if (length(fun_name) == 1) {
msg <- paste("Executing function", fun_name, "from package base")
} else {
msg <- paste("Executing function", fun_name[3], "from package", fun_name[2])
}
print(msg)
return(FUN(x))
}
但是,如前所述,它会认为全局环境中的所有函数都来自base
,即使它们是用户定义的或是通过库
调用引入的。如果这是您的用例,不要显式地说“从包库”。如果您使用deparse()
和substitute
,您将获得所需的输出,请参阅关于将变量名称传递到plot()
,的类似文章
fun\u tst fun\u tst(x=1:1e3,fun=sum)
执行函数和
[1] 500500
>乐趣(x=1:1e3,乐趣=dplyr::一瞥)
正在执行函数dplyr::scape
国际[1:1000]12345678910。。。
如果您更希望将消息作为字符向量,请将
message
替换为print
可能相关:另一个选项是将函数名作为字符传入,打印名称,然后使用eval
和parse
调用函数。@Frank谢谢,听起来是个明智的建议。我希望可能有一种简单的方法可以在不使用deparse的情况下“搜索”函数名称空间(包)及其名称,然后再次解析。。。。
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)
fun_tst <- function(x = 1:100, FUN = mean) {
print(FUN)
return(FUN(x))
}
fun_tst(x = 1:1e3, FUN = sum)
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
> as.character(substitute(dplyr::glimpse))
[1] "::" "dplyr" "glimpse"
fun_tst <- function(x = 1:100, FUN = mean) {
fun_name <- substitute(FUN)
if (length(fun_name) == 1) {
msg <- paste("Executing function", fun_name, "from package base")
} else {
msg <- paste("Executing function", fun_name[3], "from package", fun_name[2])
}
print(msg)
return(FUN(x))
}
> fun_tst(x = 1:1e3, FUN = sum)
[1] "Executing function sum from package base"
[1] 500500
> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
[1] "Executing function glimpse from package dplyr"
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...
fun_tst <- function(x = 1:100, FUN = mean) {
message(paste("Executing function",deparse(substitute(FUN))))
return((FUN(x)))
}
> fun_tst(x = 1:1e3, FUN = sum)
Executing function sum
[1] 500500
> fun_tst(x = 1:1e3, FUN = dplyr::glimpse)
Executing function dplyr::glimpse
int [1:1000] 1 2 3 4 5 6 7 8 9 10 ...