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 ...