我想编写一个函数来区分函数是从包中获取还是匿名设置,如果这些是唯一的两种可能性(单行的约束)。
如果它是后者 - 让我们称之为变量anonymous.function
- 我想要把它弄出来'由(function(parameters){inner_workings})
function(){}
封闭为eval(parse(text = call(anonymous.function()))
typeof(package::function)
返回"关闭" typeof((function(parameters) {inner_workings}))
同样返回"关闭" 我应该通过比较environment
或namespace
来区分这两者吗?
environment(package::function)
返回<environment: namespace:package>
environment((function)parameters) {inner_workings}))
返回<environment: R_GlobalEnv>
有谁能告诉我如何检查命名空间?我可以在报告的字符串中看到它<environment: namespace:...>
,但似乎无法获得这种区别。我可以看到的唯一区别是命名空间环境没有被散列 - 只有在无法为未受影响的环境运行env.profile()
时才能观察到...
当然,有一种简单的方法可以在没有try / catch语句的情况下检查匿名函数! :-)建议将不胜感激,R文档似乎在这个级别上干涸。
理想情况下 编辑访问数据结构,即没有grepl
字符串!
答案 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