假设我的命名空间中包含函数pack
的包foo
。
我想将函数pack::foo
传递给另一个函数giveArgumentFunctionName
giveArgumentFunctionName <- function(func)
{
## Get name of function argument
function.name <- someFunction(func)
return (function.name)
}
以便函数将没有包名的传递函数名输出为字符串。与此相似的东西
> test <- giveArgumentFunctionName(pack::foo)
> test
"foo"
使用deparse(substitute(foo::bar))
和match.call()
解决了类似问题,但前者给出了变量名称,如果函数被分配给一个,并且在调查后一个解决方案时挫败感占了上风。怎么能解决这个问题?
答案 0 :(得分:2)
我认为substitute
可能是你的朋友。来自文档:
的解析树
substitute
返回(未评估的)表达式expr
这允许您访问函数内的(未评估的)表达式pack::foo
。
以下内容会产生您期望的结果:
giveArgumentFunctionName <- function(func) {
function.name <- as.character(substitute(func))[[3]]
return (function.name)
}
giveArgumentFunctionName(pack::foo)
# [1] "foo"
giveArgumentFunctionName(pack::bar)
# [1] "bar"
答案 1 :(得分:1)
也许是这样的:
doit <- function(.){
s <- substitute(.)
d <- sapply(s, deparse)
if(d[[1]] %in% c(":::", "::")){
if(length(d)>2) d[3]
} else d
}
它会返回第二个组件,例如first :: second和first ::: second,以及desarsed参数(作为字符向量)。