在没有加载包的情况下,在R中调用函数

时间:2016-08-16 19:41:18

标签: r do.call

我想从包中do.call一个(导出的)函数。函数名称是一个字符串,如"lme4::lmer"

# Works, but not what I need
library(lme4)
do.call("lmer", ...)
# Also works, but not what I need
lme4::lmer(...)
# Doesn't work:
do.call("lme4::lmer", ...)

2 个答案:

答案 0 :(得分:6)

您不能在字符串中包含::,因为::是一个函数。不评估和解析该字符串。 do.call只是假定存在该名称的函数。就像::一样,$也是一个函数,所以这不起作用

a<-list(f=function(x) x+1)
do.call(a$f, list(4))
# [1] 5
do.call("a$f", list(4))
# Error in do.call("a$f", list(4)) : could not find function "a$f"

如果您希望能够从命名空间中查找函数,可以编写一个辅助函数,在函数包含::

时解析它们
getfun<-function(x) {
    if(length(grep("::", x))>0) {
        parts<-strsplit(x, "::")[[1]]
        getExportedValue(parts[1], parts[2])
    } else {
        x
    }
}
getfun("lme4::lmer")

这应该有效

do.call(getfun("lme4::lmer"), list(
    Reaction ~ Days + (Days | Subject), 
    quote(lme4::sleepstudy)))

答案 1 :(得分:2)

do.call(eval(parse(text="lme4::lmer")), ...)

带解析的eval会起作用!

> tmp <- expand.grid(letters[1:2], 1:3, c("+", "-"))
> do.call(eval(parse(text='stringr::str_c')), c(tmp, sep = ""))

 [1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"

参考:https://www.r-bloggers.com/converting-a-string-to-a-variable-name-on-the-fly-and-vice-versa-in-r/