如何检查R中的函数是否是匿名的

时间:2015-03-03 13:44:24

标签: r

我想编写一个函数来区分函数是从包中获取还是匿名设置,如果这些是唯一的两种可能性(单行的约束)。

如果它是后者 - 让我们称之为变量anonymous.function - 我想要把它弄出来'由(function(parameters){inner_workings})

function(){}封闭为eval(parse(text = call(anonymous.function()))
  • typeof(package::function)返回"关闭"
  • typeof((function(parameters) {inner_workings}))同样返回"关闭"

我应该通过比较environmentnamespace来区分这两者吗?

  • environment(package::function)返回<environment: namespace:package>
  • environment((function)parameters) {inner_workings}))返回<environment: R_GlobalEnv>
如果环境是GlobalEnv,我会犹豫是否只假设它是匿名的,因为如果我在某些情况下正确理解,可以在全局下面遍历堆栈,例如如果我在一个函数中运行此函数,那么我要检查环境是否是命名空间。

有谁能告诉我如何检查命名空间?我可以在报告的字符串中看到它<environment: namespace:...>,但似乎无法获得这种区别。我可以看到的唯一区别是命名空间环境没有被散列 - 只有在无法为未受影响的环境运行env.profile()时才能观察到...

当然,有一种简单的方法可以在没有try / catch语句的情况下检查匿名函数! :-)建议将不胜感激,R文档似乎在这个级别上干涸。

理想情况下

编辑访问数据结构,即没有grepl字符串!

1 个答案:

答案 0 :(得分:3)

packageName适合您吗?我不确定像f1 <- mean这样的函数的期望输出。请参阅下面的我的版本。

is_package_fun <- function(fun) 
  !is.null(packageName(environment(fun)))

# defining functions
f1 <- mean
f2 <- function(x) mean(x)

# checking
is_package_fun(mean)
## [1] TRUE
is_package_fun(f1) # not sure about desired output...
## [1] TRUE
is_package_fun(f2)
## [1] FALSE
相关问题